ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGExNTJ4LmMgYi9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjhlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvYWhhMTUyeC5jCkBAIC0wLDAgKzEsMzk4MiBAQAorLyogYWhhMTUyeC5jIC0tIEFkYXB0ZWMgQUhBLTE1MnggZHJpdmVyCisgKiBBdXRob3I6IEr8cmdlbiBFLiBGaXNjaGVyLCBmaXNjaGVyQG5vcmJpdC5kZQorICogQ29weXJpZ2h0IDE5OTMtMjAwNCBK/HJnZW4gRS4gRmlzY2hlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogJElkOiBhaGExNTJ4LmMsdiAyLjcgMjAwNC8wMS8yNCAxMTo0Mjo1OSBmaXNjaGVyIEV4cCAkCisgKgorICogJExvZzogYWhhMTUyeC5jLHYgJAorICogUmV2aXNpb24gMi43ICAyMDA0LzAxLzI0IDExOjQyOjU5ICBmaXNjaGVyCisgKiAtIGdhdGhlciBjb2RlIHRoYXQgaXMgbm90IHVzZWQgYnkgUENNQ0lBIGF0IHRoZSBlbmQKKyAqIC0gbW92ZSByZXF1ZXN0X3JlZ2lvbiBmb3IgIVBDTUNJQSBjYXNlIHRvIGRldGVjdGlvbgorICogLSBtaWdyYXRpb24gdG8gbmV3IHNjc2kgaG9zdCBhcGkgKHJlbW92ZSBsZWdhY3kgY29kZSkKKyAqIC0gZnJlZSBob3N0IHNjcmliYmxlIGJlZm9yZSBzY3NpX2RvbmUKKyAqIC0gZml4IGVycm9yIGhhbmRsaW5nCisgKiAtIG9uZSBpc2FwbnAgZGV2aWNlIGFkZGVkIHRvIGlkX3RhYmxlCisgKgorICogUmV2aXNpb24gMi42ICAyMDAzLzEwLzMwIDIwOjUyOjQ3ICBmaXNjaGVyCisgKiAtIGludGVyZmFjZXMgY2hhbmdlcyBmb3Iga2VybmVsIDIuNgorICogLSBhaGExNTJ4X3Byb2JlX29uZSBpbnRyb2R1Y2VkIGZvciBwY21jaWEgc3R1YgorICogLSBmaXhlZCBwbnBkZXYgaGFuZGxpbmcKKyAqIC0gaW5zdGVhZCBvZiBhbGxvY2F0aW9uIGEgbmV3IG9uZSwgcmV1c2UgY29tbWFuZCBmb3IgcmVxdWVzdCBzZW5zZSBhZnRlciBjaGVjayBjb25kaXRpb24gYW5kIHJlc2V0CisgKiAtIGZpeGVzIHJhY2UgaW4gaXNfY29tcGxldGUKKyAqCisgKiBSZXZpc2lvbiAyLjUgIDIwMDIvMDQvMTQgMTE6MjQ6NTMgIGZpc2NoZXIKKyAqIC0gaXNhcG5wIHN1cHBvcnQKKyAqIC0gYWJvcnQgZml4ZWQKKyAqIC0gMi41IHN1cHBvcnQKKyAqCisgKiBSZXZpc2lvbiAyLjQgIDIwMDAvMTIvMTYgMTI6NTM6NTYgIGZpc2NoZXIKKyAqIC0gYWxsb3cgUkVRVUVTVCBTRU5TRSB0byBiZSBxdWV1ZWQKKyAqIC0gaGFuZGxlIHNoYXJlZCBQQ0kgaW50ZXJydXB0cworICoKKyAqIFJldmlzaW9uIDIuMyAgMjAwMC8xMS8wNCAxNjo0MDoyNiAgZmlzY2hlcgorICogLSBoYW5kbGUgZGF0YSBvdmVycnVucworICogLSBleHRlbmQgdGltZW91dCBmb3IgZGF0YSBwaGFzZXMKKyAqCisgKiBSZXZpc2lvbiAyLjIgIDIwMDAvMDgvMDggMTk6NTQ6NTMgIGZpc2NoZXIKKyAqIC0gbWlub3IgY2hhbmdlcworICoKKyAqIFJldmlzaW9uIDIuMSAgMjAwMC8wNS8xNyAxNjoyMzoxNyAgZmlzY2hlcgorICogLSBzaWduYXR1cmUgdXBkYXRlCisgKiAtIGZpeCBmb3IgZGF0YSBvdXQgdy9vIHNjYXR0ZXIgZ2F0aGVyCisgKgorICogUmV2aXNpb24gMi4wICAxOTk5LzEyLzI1IDE1OjA3OjMyICBmaXNjaGVyCisgKiAtIGludGVycnVwdCByb3V0aW5lIGNvbXBsZXRseSByZXdvcmtlZAorICogLSBiYXNpYyBzdXBwb3J0IGZvciBuZXcgZWggY29kZQorICoKKyAqIFJldmlzaW9uIDEuMjEgIDE5OTkvMTEvMTAgMjM6NDY6MzYgIGZpc2NoZXIKKyAqIC0gZGVmYXVsdCB0byBzeW5jaHJvbm91cyBvcGVyYXRpb24KKyAqIC0gc3luY2hyb25vdXMgbmVnb3RpYXRpb24gZml4ZWQKKyAqIC0gYWRkZWQgdGltZW91dCB0byBsb29wcworICogLSBkZWJ1Z2dpbmcgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIHRocm91Z2ggcHJvY2ZzCisgKgorICogUmV2aXNpb24gMS4yMCAgMTk5OS8xMS8wNyAxODozNzozMSAgZmlzY2hlcgorICogLSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd29ya3MKKyAqIC0gcmVzaWQgc3VwcG9ydCBmb3Igc2cgZHJpdmVyCisgKgorICogUmV2aXNpb24gMS4xOSAgMTk5OS8xMS8wMiAyMjozOTo1OSAgZmlzY2hlcgorICogLSBtb3ZlZCBsZWFkaW5nIGNvbW1lbnRzIHRvIFJFQURNRS5haGExNTJ4CisgKiAtIG5ldyBhZGRpdGlvbmFsIG1vZHVsZSBwYXJhbWV0ZXJzCisgKiAtIHVwZGF0ZXMgZm9yIDIuMworICogLSBzdXBwb3J0IGZvciB0aGUgVHJpcGFjZSBUQzE1NTAgY29udHJvbGxlcgorICogLSBpbnRlcnJ1cHQgaGFuZGxpbmcgY2hhbmdlZAorICoKKyAqIFJldmlzaW9uIDEuMTggIDE5OTYvMDkvMDcgMjA6MTA6NDAgIGZpc2NoZXIKKyAqIC0gZml4ZWQgY2FuX3F1ZXVlIGhhbmRsaW5nIChtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcyB3b3JraW5nIGFnYWluKQorICoKKyAqIFJldmlzaW9uIDEuMTcgIDE5OTYvMDgvMTcgMTY6MDU6MTQgIGZpc2NoZXIKKyAqIC0gYmlvc3BhcmFtIGltcHJvdmVkCisgKiAtIGludGVycnVwdCB2ZXJpZmljYXRpb24KKyAqIC0gdXBkYXRlZCBkb2N1bWVudGF0aW9uCisgKiAtIGNsZWFudXBzCisgKgorICogUmV2aXNpb24gMS4xNiAgMTk5Ni8wNi8wOSAwMDowNDo1NiAgcm9vdAorICogLSBhZGRlZCBjb25maWd1cmF0aW9uIHN5bWJvbHMgZm9yIGluc21vZCAoYWhhMTUyeC9haGExNTJ4MSkKKyAqCisgKiBSZXZpc2lvbiAxLjE1ICAxOTk2LzA0LzMwIDE0OjUyOjA2ICBmaXNjaGVyCisgKiAtIHByb2MgaW5mbyBmaXhlZAorICogLSBzdXBwb3J0IGZvciBleHRlbmRlZCB0cmFuc2xhdGlvbiBmb3IgPjFHQiBkaXNrcworICoKKyAqIFJldmlzaW9uIDEuMTQgIDE5OTYvMDEvMTcgIDE1OjExOjIwICBmaXNjaGVyCisgKiAtIGZpeGVkIGxvY2t1cCBpbiBNRVNTQUdFIElOIHBoYXNlIGFmdGVyIHJlY29ubmVjdGlvbgorICoKKyAqIFJldmlzaW9uIDEuMTMgIDE5OTYvMDEvMDkgIDAyOjE1OjUzICBmaXNjaGVyCisgKiAtIHNvbWUgY2xlYW51cHMKKyAqIC0gbW92ZWQgcmVxdWVzdF9pcnEgYmVoaW5kIGNvbnRyb2xsZXIgaW5pdGlhbGl6YXRpb24KKyAqICAgKHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMpCisgKgorICogUmV2aXNpb24gMS4xMiAgMTk5NS8xMi8xNiAgMTI6MjY6MDcgIGZpc2NoZXIKKyAqIC0gYmFycmllcigpcyBhZGRlZAorICogLSBjb25maWd1cmFibGUgUkVTRVQgZGVsYXkgYWRkZWQKKyAqCisgKiBSZXZpc2lvbiAxLjExICAxOTk1LzEyLzA2ICAyMToxODozNSAgZmlzY2hlcgorICogLSBzb21lIG1pbm9yIHVwZGF0ZXMKKyAqCisgKiBSZXZpc2lvbiAxLjEwICAxOTk1LzA3LzIyICAxOToxODo0NSAgZmlzY2hlcgorICogLSBzdXBwb3J0IGZvciAyIGNvbnRyb2xsZXJzCisgKiAtIHN0YXJ0ZWQgc3luY2hyb25vdXMgZGF0YSB0cmFuc2ZlcnMgKG5vdCB3b3JraW5nIHlldCkKKyAqCisgKiBSZXZpc2lvbiAxLjkgIDE5OTUvMDMvMTggIDA5OjIwOjI0ICByb290CisgKiAtIHBhdGNoZXMgZm9yIFBDTUNJQSBhbmQgbW9kdWxlcworICoKKyAqIFJldmlzaW9uIDEuOCAgMTk5NS8wMS8yMSAgMjI6MDc6MTkgIHJvb3QKKyAqIC0gc25hcmZfcmVnaW9uID0+IHJlcXVlc3RfcmVnaW9uCisgKiAtIGFoYTE1MnhfaW50ciBpbnRlcmZhY2UgY2hhbmdlCisgKgorICogUmV2aXNpb24gMS43ICAxOTk1LzAxLzAyICAyMzoxOTozNiAgcm9vdAorICogLSB1cGRhdGVkIENPTU1BTkRfU0laRSB0byBjbWRfbGVuCisgKiAtIGNoYW5nZWQgc3RpKCkgdG8gcmVzdG9yZV9mbGFncygpCisgKiAtIGZpeGVkIHNvbWUgI2lmZGVmIHdoaWNoIGdlbmVyYXRlZCB3YXJuaW5ncworICoKKyAqIFJldmlzaW9uIDEuNiAgMTk5NC8xMS8yNCAgMjA6MzU6MjcgIHJvb3QKKyAqIC0gcHJvYmxlbSB3aXRoIG9kZCBudW1iZXIgb2YgYnl0ZXMgaW4gZmlmbyBmaXhlZAorICoKKyAqIFJldmlzaW9uIDEuNSAgMTk5NC8xMC8zMCAgMTQ6Mzk6NTYgIHJvb3QKKyAqIC0gYWJvcnQgY29kZSBmaXhlZAorICogLSBkZWJ1Z2dpbmcgaW1wcm92ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTQvMDkvMTIgIDExOjMzOjAxICByb290CisgKiAtIGlycWFjdGlvbiB0byByZXF1ZXN0X2lycQorICogLSBhYm9ydGlvbiB1cGRhdGVkCisgKgorICogUmV2aXNpb24gMS4zICAxOTk0LzA4LzA0ICAxMzo1MzowNSAgcm9vdAorICogLSB1cGRhdGVzIGZvciBtaWQtbGV2ZWwtZHJpdmVyIGNoYW5nZXMKKyAqIC0gYWNjZXB0IHVuZXhwZWN0ZWQgQlVTRlJFRSBwaGFzZSBhcyBlcnJvciBjb25kaXRpb24KKyAqIC0gcGFyaXR5IGNoZWNrIG5vdyBjb25maWd1cmFibGUKKyAqCisgKiBSZXZpc2lvbiAxLjIgIDE5OTQvMDcvMDMgIDEyOjU2OjM2ICByb290CisgKiAtIGNsZWFuZWQgdXAgZGVidWdnaW5nIGNvZGUKKyAqIC0gbW9yZSB0d2Vha2luZyBvbiByZXNldCBkZWxheXMKKyAqIC0gdXBkYXRlZCBhYm9ydC9yZXNldCBjb2RlIChwcmV0dHkgdW50ZXN0ZWQuLi4pCisgKgorICogUmV2aXNpb24gMS4xICAxOTk0LzA1LzI4ICAyMToxODo0OSAgcm9vdAorICogLSB1cGRhdGUgZm9yIG1pZC1sZXZlbCBpbnRlcmZhY2UgY2hhbmdlIChhYm9ydC1yZXNldCkKKyAqIC0gZGVsYXlzIGFmdGVyIHJlc2V0cyBhZGp1c3RlZCBmb3Igc29tZSBzbG93IGRldmljZXMKKyAqCisgKiBSZXZpc2lvbiAxLjAgIDE5OTQvMDMvMjUgIDEyOjUyOjAwICByb290CisgKiAtIEZpeGVkICJtb3JlIGRhdGEgdGhhbiBleHBlY3RlZCIgcHJvYmxlbQorICogLSBhZGRlZCBuZXcgQklPUyBzaWduYXR1cmVzCisgKgorICogUmV2aXNpb24gMC4xMDIgIDE5OTQvMDEvMzEgIDIwOjQ0OjEyICByb290CisgKiAtIG1pbm9yIGNoYW5nZXMgaW4gaW5zdy9vdXRzdyBoYW5kbGluZworICoKKyAqIFJldmlzaW9uIDAuMTAxICAxOTkzLzEyLzEzICAwMToxNjoyNyAgcm9vdAorICogLSBmaXhlZCBTVEFUVVMgcGhhc2UgKG5vbi1HT09EIHN0YXRpIHdlcmUgZHJvcHBlZCBzb21ldGltZXM7CisgKiAgIGZpeGVzIHByb2JsZW1zIHdpdGggQ0QtUk9NIHNlY3RvciBzaXplIGRldGVjdGlvbiAmIG1lZGlhIGNoYW5nZSkKKyAqCisgKiBSZXZpc2lvbiAwLjEwMCAgMTk5My8xMi8xMCAgMTY6NTg6NDcgIHJvb3QKKyAqIC0gZml4IGZvciB1bnN1Y2Nlc3NmdWwgc2VsZWN0aW9ucyBpbiBjYXNlIG9mIG5vbi1jb250aW51b3VzIGlkIGFzc2lnbm1lbnRzCisgKiAgIG9uIHRoZSBzY3NpIGJ1cy4KKyAqCisgKiBSZXZpc2lvbiAwLjk5ICAxOTkzLzEwLzI0ICAxNjoxOTo1OSAgcm9vdAorICogLSBmaXhlZCBEQVRBIElOIChyYXJlIHJlYWQgZXJyb3JzIGdvbmUpCisgKgorICogUmV2aXNpb24gMC45OCAgMTk5My8xMC8xNyAgMTI6NTQ6NDQgIHJvb3QKKyAqIC0gZml4ZWQgc29tZSByZWNlbnQgZml4ZXMgKHNoYW1lIG9uIG1lKQorICogLSBtb3ZlZCBpbml0aWFsaXphdGlvbiBvZiBzY3JhdGNoIGFyZWEgdG8gYWhhMTUyeF9xdWV1ZQorICoKKyAqIFJldmlzaW9uIDAuOTcgIDE5OTMvMTAvMDkgIDE4OjUzOjUzICByb290CisgKiAtIERBVEEgSU4gZml4ZWQuIFJhcmVseSBsZWZ0IGRhdGEgaW4gdGhlIGZpZm8uCisgKgorICogUmV2aXNpb24gMC45NiAgMTk5My8xMC8wMyAgMDA6NTM6NTkgIHJvb3QKKyAqIC0gbWlub3IgY2hhbmdlcyBvbiBEQVRBIElOCisgKgorICogUmV2aXNpb24gMC45NSAgMTk5My8wOS8yNCAgMTA6MzY6MDEgIHJvb3QKKyAqIC0gY2hhbmdlIGhhbmRsaW5nIG9mIE1TR0kgYWZ0ZXIgcmVzZWxlY3Rpb24KKyAqIC0gZml4ZWQgc3RpL2NsaQorICogLSBtaW5vciBjaGFuZ2VzCisgKgorICogUmV2aXNpb24gMC45NCAgMTk5My8wOS8xOCAgMTQ6MDg6MjIgIHJvb3QKKyAqIC0gZml4ZWQgYnVnIGluIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmQgY29kZQorICogLSBjaGFuZ2VkIGRldGVjdGlvbgorICogLSBzdXBwb3J0IGZvciBrZXJuZWwgY29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24KKyAqIC0gcmVzZXQgY29ycmVjdGVkCisgKiAtIGNoYW5nZWQgbWVzc2FnZSBoYW5kbGluZworICoKKyAqIFJldmlzaW9uIDAuOTMgIDE5OTMvMDkvMTUgIDIwOjQxOjE5ICByb290CisgKiAtIGZpeGVkIGJ1Z3Mgd2l0aCBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcworICoKKyAqIFJldmlzaW9uIDAuOTIgIDE5OTMvMDkvMTMgIDAyOjQ2OjMzICByb290CisgKiAtIG11bHRpcGxlIG91dHN0YW5kaW5nIGNvbW1hbmRzIHdvcmsgKG5vIHByb2JsZW1zIHdpdGggSUJNIGRyaXZlKQorICoKKyAqIFJldmlzaW9uIDAuOTEgIDE5OTMvMDkvMTIgIDIwOjUxOjQ2ICByb290CisgKiBhZGRlZCBtdWx0aXBsZSBvdXRzdGFuZGluZyBjb21tYW5kcworICogKHNvbWUgcHJvYmxlbSB3aXRoIHRoaXMgJCUmPyBJQk0gZGV2aWNlIHJlbWFpbikKKyAqCisgKiBSZXZpc2lvbiAwLjkgIDE5OTMvMDkvMTIgIDExOjExOjIyICByb290CisgKiAtIGNvcnJlY3RlZCBhdXRvLWNvbmZpZ3VyYXRpb24KKyAqIC0gY2hhbmdlZCB0aGUgYXV0by1jb25maWd1cmF0aW9uIChhZGRlZCBzb21lICcjZGVmaW5lJ3MpCisgKiAtIGFkZGVkIHN1cHBvcnQgZm9yIGRpcy0vcmVjb25uZWN0aW9uCisgKgorICogUmV2aXNpb24gMC44ICAxOTkzLzA5LzA2ICAyMzowOTozOSAgcm9vdAorICogLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgZHJpdmUgYWN0aXZpdHkgbGlnaHQKKyAqIC0gbWlub3IgY2hhbmdlcworICoKKyAqIFJldmlzaW9uIDAuNyAgMTk5My8wOS8wNSAgMTQ6MzA6MTUgIHJvb3QKKyAqIC0gaW1wcm92ZWQgcGhhc2UgZGV0ZWN0aW9uCisgKiAtIG5vdyB1c2luZyB0aGUgbmV3IHNuYXJmX3JlZ2lvbiBjb2RlIG9mIDAuOTlwbDEzCisgKgorICogUmV2aXNpb24gMC42ICAxOTkzLzA5LzAyICAxMTowMTozOCAgcm9vdAorICogZmlyc3QgcHVibGljIHJlbGVhc2U7IGFkZGVkIHNvbWUgc2lnbmF0dXJlcyBhbmQgYmlvc3BhcmFtKCkKKyAqCisgKiBSZXZpc2lvbiAwLjUgIDE5OTMvMDgvMzAgIDEwOjIzOjMwICByb290CisgKiBmaXhlZCB0aW1pbmcgcHJvYmxlbXMgd2l0aCBteSBJQk0gZHJpdmUKKyAqCisgKiBSZXZpc2lvbiAwLjQgIDE5OTMvMDgvMjkgIDE0OjA2OjUyICByb290CisgKiBmaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGltZW91dHMgZHVlIGluY29tcGxldGUgY29tbWFuZHMKKyAqCisgKiBSZXZpc2lvbiAwLjMgIDE5OTMvMDgvMjggIDE1OjU1OjAzICByb290CisgKiB3cml0aW5nIGRhdGEgd29ya3MgdG9vLiAgbW91bnRlZCBhbmQgd29ya2VkIG9uIGEgZG9zIHBhcnRpdGlvbgorICoKKyAqIFJldmlzaW9uIDAuMiAgMTk5My8wOC8yNyAgMjI6NDI6MDcgIHJvb3QKKyAqIHJlYWRpbmcgZGF0YSB3b3Jrcy4gIE1vdW50ZWQgYSBtc2RvcyBwYXJ0aXRpb24uCisgKgorICogUmV2aXNpb24gMC4xICAxOTkzLzA4LzI1ICAxMzozODozMCAgcm9vdAorICogZmlyc3QgImRhbW4gdGhpbmcgZG9lc24ndCB3b3JrIiB2ZXJzaW9uCisgKgorICogUmV2aXNpb24gMC4wICAxOTkzLzA4LzE0ICAxOTo1NDoyNSAgcm9vdAorICogZW1wdHkgZnVuY3Rpb24gYm9kaWVzOyBkZXRlY3QoKSB3b3Jrcy4KKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgCisgc2VlIERvY3VtZW50YXRpb24vc2NzaS9haGExNTJ4LnR4dCBmb3IgY29uZmlndXJhdGlvbiBkZXRhaWxzCisKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpY2FtLmg+CisKKyNpbmNsdWRlICJzY3NpLmgiCisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlICJhaGExNTJ4LmgiCisKKworLyogREVGSU5FUyAqLworCisvKiBGb3IgUENNQ0lBIGNhcmRzLCBhbHdheXMgdXNlIEFVVE9DT05GICovCisjaWYgZGVmaW5lZChQQ01DSUEpIHx8IGRlZmluZWQoTU9EVUxFKQorI2lmICFkZWZpbmVkKEFVVE9DT05GKQorI2RlZmluZSBBVVRPQ09ORgorI2VuZGlmCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEFVVE9DT05GKSAmJiAhZGVmaW5lZChTRVRVUDApCisjZXJyb3IgZGVmaW5lIEFVVE9DT05GIG9yIFNFVFVQMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisjZGVmaW5lIERFQlVHX0RFRkFVTFQgZGVidWdfZWgKKworI2RlZmluZSBEUFJJTlRLKHdoZW4sbXNncy4uLikgXAorCWRvIHsgaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmICh3aGVuKSkgcHJpbnRrKG1zZ3MpOyB9IHdoaWxlKDApCisKKyNkZWZpbmUgRE9fTE9DSyhmbGFncykJXAorCWRvIHsgXAorCQlpZihzcGluX2lzX2xvY2tlZCgmUUxPQ0spKSB7IFwKKwkJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiKCVzOiVkKSBhbHJlYWR5IGxvY2tlZCBhdCAlczolZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgUUxPQ0tFUiwgUUxPQ0tFUkwpOyBcCisJCX0gXAorCQlEUFJJTlRLKGRlYnVnX2xvY2tzLCBERUJVR19MRUFEICIoJXM6JWQpIGxvY2tpbmdcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisJCXNwaW5fbG9ja19pcnFzYXZlKCZRTE9DSyxmbGFncyk7IFwKKwkJRFBSSU5USyhkZWJ1Z19sb2NrcywgREVCVUdfTEVBRCAiKCVzOiVkKSBsb2NrZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisJCVFMT0NLRVI9X19GVU5DVElPTl9fOyBcCisJCVFMT0NLRVJMPV9fTElORV9fOyBcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERPX1VOTE9DSyhmbGFncykJXAorCWRvIHsgXAorCQlEUFJJTlRLKGRlYnVnX2xvY2tzLCBERUJVR19MRUFEICIoJXM6JWQpIHVubG9ja2luZyAobG9ja2VkIGF0ICVzOiVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgUUxPQ0tFUiwgUUxPQ0tFUkwpOyBcCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlFMT0NLLGZsYWdzKTsgXAorCQlEUFJJTlRLKGRlYnVnX2xvY2tzLCBERUJVR19MRUFEICIoJXM6JWQpIHVubG9ja2VkXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAorCQlRTE9DS0VSPSIobm90IGxvY2tlZCkiOyBcCisJCVFMT0NLRVJMPTA7IFwKKwl9IHdoaWxlKDApCisKKyNlbHNlCisjZGVmaW5lIERQUklOVEsod2hlbixtc2dzLi4uKQorI2RlZmluZQlET19MT0NLKGZsYWdzKQkJc3Bpbl9sb2NrX2lycXNhdmUoJlFMT0NLLGZsYWdzKQorI2RlZmluZQlET19VTkxPQ0soZmxhZ3MpCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlFMT0NLLGZsYWdzKQorI2VuZGlmCisKKyNkZWZpbmUgTEVBRAkJIihzY3NpJWQ6JWQ6JWQpICIKKyNkZWZpbmUgV0FSTl9MRUFECUtFUk5fV0FSTklORwlMRUFECisjZGVmaW5lIElORk9fTEVBRAlLRVJOX0lORk8JTEVBRAorI2RlZmluZSBOT1RFX0xFQUQJS0VSTl9OT1RJQ0UJTEVBRAorI2RlZmluZSBFUlJfTEVBRAlLRVJOX0VSUglMRUFECisjZGVmaW5lIERFQlVHX0xFQUQJS0VSTl9ERUJVRwlMRUFECisjZGVmaW5lIENNRElORk8oY21kKSBcCisJCQkoY21kKSA/ICgoY21kKS0+ZGV2aWNlLT5ob3N0LT5ob3N0X25vKSA6IC0xLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoY21kKSA/ICgoY21kKS0+ZGV2aWNlLT5pZCAmIDB4MGYpIDogLTEsIFwKKwkJCShjbWQpID8gKChjbWQpLT5kZXZpY2UtPmx1biAmIDB4MDcpIDogLTEKKworI2RlZmluZSBERUxBWV9ERUZBVUxUIDEwMDAKKworI2lmIGRlZmluZWQoUENNQ0lBKQorI2RlZmluZSBJUlFfTUlOIDAKKyNkZWZpbmUgSVJRX01BWCAxNgorI2Vsc2UKKyNkZWZpbmUgSVJRX01JTiA5CisjaWYgZGVmaW5lZChfX1BQQykKKyNkZWZpbmUgSVJRX01BWCAoTlJfSVJRUy0xKQorI2Vsc2UKKyNkZWZpbmUgSVJRX01BWCAxMgorI2VuZGlmCisjZW5kaWYKKworZW51bSB7CisJbm90X2lzc3VlZAk9IDB4MDAwMSwJLyogY29tbWFuZCBub3QgeWV0IGlzc3VlZCAqLworCXNlbGVjdGluZwk9IDB4MDAwMiwgCS8qIHRhcmdldCBpcyBiZWVpbmcgc2VsZWN0ZWQgKi8KKwlpZGVudGlmaWVkCT0gMHgwMDA0LAkvKiBJREVOVElGWSB3YXMgc2VudCAqLworCWRpc2Nvbm5lY3RlZAk9IDB4MDAwOCwJLyogdGFyZ2V0IGRpc2Nvbm5lY3RlZCAqLworCWNvbXBsZXRlZAk9IDB4MDAxMCwJLyogdGFyZ2V0IHNlbnQgQ09NTUFORCBDT01QTEVURSAqLyAKKwlhYm9ydGVkCQk9IDB4MDAyMCwJLyogQUJPUlQgd2FzIHNlbnQgKi8KKwlyZXNldHRlZAk9IDB4MDA0MCwJLyogQlVTIERFVklDRSBSRVNFVCB3YXMgc2VudCAqLworCXNwaW9yZHkJCT0gMHgwMDgwLAkvKiB3YWl0aW5nIGZvciBTUElPUkRZIHRvIHJhaXNlICovCisJc3luY25lZwkJPSAweDAxMDAsCS8qIHN5bmNocm9ub3VzIG5lZ290aWF0aW9uIGluIHByb2dyZXNzICovCisJYWJvcnRpbmcJPSAweDAyMDAsCS8qIEFCT1JUIGlzIHBlbmRpbmcgKi8KKwlyZXNldHRpbmcJPSAweDA0MDAsCS8qIEJVUyBERVZJQ0UgUkVTRVQgaXMgcGVuZGluZyAqLworCWNoZWNrX2NvbmRpdGlvbiA9IDB4MDgwMCwJLyogcmVxdWVzdGluZyBzZW5zZSBhZnRlciBDSEVDSyBDT05ESVRJT04gKi8KK307CisKK01PRFVMRV9BVVRIT1IoIkr8cmdlbiBGaXNjaGVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oQUhBMTUyWF9SRVZJRCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZiAhZGVmaW5lZChQQ01DSUEpCisjaWYgZGVmaW5lZChNT0RVTEUpCitzdGF0aWMgaW50IGlvW10gPSB7MCwgMH07Cittb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCJiYXNlIGlvIGFkZHJlc3Mgb2YgY29udHJvbGxlciIpOworCitzdGF0aWMgaW50IGlycVtdID0gezAsIDB9OworbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCJpbnRlcnJ1cHQgZm9yIGNvbnRyb2xsZXIiKTsKKworc3RhdGljIGludCBzY3NpaWRbXSA9IHs3LCA3fTsKK21vZHVsZV9wYXJhbV9hcnJheShzY3NpaWQsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNjc2lpZCwic2NzaSBpZCBvZiBjb250cm9sbGVyIik7CisKK3N0YXRpYyBpbnQgcmVjb25uZWN0W10gPSB7MSwgMX07Cittb2R1bGVfcGFyYW1fYXJyYXkocmVjb25uZWN0LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWNvbm5lY3QsImFsbG93IHRhcmdldHMgdG8gZGlzY29ubmVjdCIpOworCitzdGF0aWMgaW50IHBhcml0eVtdID0gezEsIDF9OworbW9kdWxlX3BhcmFtX2FycmF5KHBhcml0eSwgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocGFyaXR5LCJ1c2Ugc2NzaSBwYXJpdHkiKTsKKworc3RhdGljIGludCBzeW5jW10gPSB7MSwgMX07Cittb2R1bGVfcGFyYW1fYXJyYXkoc3luYywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc3luYywidXNlIHN5bmNocm9ub3VzIHRyYW5zZmVycyIpOworCitzdGF0aWMgaW50IGRlbGF5W10gPSB7REVMQVlfREVGQVVMVCwgREVMQVlfREVGQVVMVH07Cittb2R1bGVfcGFyYW1fYXJyYXkoZGVsYXksIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5LCJzY3NpIHJlc2V0IGRlbGF5Iik7CisKK3N0YXRpYyBpbnQgZXh0dHJhbnNbXSA9IHswLCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShleHR0cmFucywgaW50LCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZXh0dHJhbnMsInVzZSBleHRlbmRlZCB0cmFuc2xhdGlvbiIpOworCisjaWYgIWRlZmluZWQoQUhBMTUyWF9ERUJVRykKK3N0YXRpYyBpbnQgYWhhMTUyeFtdID0gezAsIDExLCA3LCAxLCAxLCAwLCBERUxBWV9ERUZBVUxULCAwfTsKK21vZHVsZV9wYXJhbV9hcnJheShhaGExNTJ4LCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4LCAicGFyYW1ldGVycyBmb3IgZmlyc3QgY29udHJvbGxlciIpOworCitzdGF0aWMgaW50IGFoYTE1MngxW10gPSB7MCwgMTEsIDcsIDEsIDEsIDAsIERFTEFZX0RFRkFVTFQsIDB9OworbW9kdWxlX3BhcmFtX2FycmF5KGFoYTE1MngxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4MSwgInBhcmFtZXRlcnMgZm9yIHNlY29uZCBjb250cm9sbGVyIik7CisjZWxzZQorc3RhdGljIGludCBkZWJ1Z1tdID0ge0RFQlVHX0RFRkFVTFQsIERFQlVHX0RFRkFVTFR9OworbW9kdWxlX3BhcmFtX2FycmF5KGRlYnVnLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImZsYWdzIGZvciBkcml2ZXIgZGVidWdnaW5nIik7CisKK3N0YXRpYyBpbnQgYWhhMTUyeFtdICAgPSB7MCwgMTEsIDcsIDEsIDEsIDEsIERFTEFZX0RFRkFVTFQsIDAsIERFQlVHX0RFRkFVTFR9OworbW9kdWxlX3BhcmFtX2FycmF5KGFoYTE1MngsIGludCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGFoYTE1MngsICJwYXJhbWV0ZXJzIGZvciBmaXJzdCBjb250cm9sbGVyIik7CisKK3N0YXRpYyBpbnQgYWhhMTUyeDFbXSAgPSB7MCwgMTEsIDcsIDEsIDEsIDEsIERFTEFZX0RFRkFVTFQsIDAsIERFQlVHX0RFRkFVTFR9OworbW9kdWxlX3BhcmFtX2FycmF5KGFoYTE1MngxLCBpbnQsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhhaGExNTJ4MSwgInBhcmFtZXRlcnMgZm9yIHNlY29uZCBjb250cm9sbGVyIik7CisjZW5kaWYgLyogIWRlZmluZWQoQUhBMTUyWF9ERUJVRykgKi8KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworI2lmZGVmIF9fSVNBUE5QX18KK3N0YXRpYyBzdHJ1Y3QgaXNhcG5wX2RldmljZV9pZCBpZF90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBJU0FQTlBfQU5ZX0lELCBJU0FQTlBfQU5ZX0lELAorCQlJU0FQTlBfVkVORE9SKCdBJywnRCcsJ1AnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MTUwNSksIDAgfSwKKwl7IElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ0EnLCdEJywnUCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgxNTMwKSwgMCB9LAorCXsgSVNBUE5QX0RFVklDRV9TSU5HTEVfRU5ELCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpc2FwbnAsIGlkX3RhYmxlKTsKKyNlbmRpZiAvKiBJU0FQTlAgKi8KKworI2VuZGlmIC8qICFQQ01DSUEgKi8KKworc3RhdGljIGludCByZWdpc3RlcmVkX2NvdW50PTA7CitzdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqYWhhMTUyeF9ob3N0WzJdOworc3RhdGljIFNjc2lfSG9zdF9UZW1wbGF0ZSBhaGExNTJ4X2RyaXZlcl90ZW1wbGF0ZTsKKworLyoKKyAqIGludGVybmFsIHN0YXRlcyBvZiB0aGUgaG9zdAorICoKKyAqLyAKK2VudW0gYWhhMTUyeF9zdGF0ZSB7CisJaWRsZT0wLAorCXVua25vd24sCisJc2VsZG8sCisJc2VsZGksCisJc2VsdG8sCisJYnVzZnJlZSwKKwltc2dvLAorCWNtZCwKKwltc2dpLAorCXN0YXR1cywKKwlkYXRhaSwKKwlkYXRhbywKKwlwYXJlcnIsCisJcnN0aSwKKwltYXhzdGF0ZQorfTsKKworLyoKKyAqIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGhvc3QKKyAqCisgKi8KK3N0cnVjdCBhaGExNTJ4X2hvc3RkYXRhIHsKKwlTY3NpX0NtbmQgKmlzc3VlX1NDOworCQkvKiBwZW5kaW5nIGNvbW1hbmRzIHRvIGlzc3VlICovCisKKwlTY3NpX0NtbmQgKmN1cnJlbnRfU0M7CisJCS8qIGN1cnJlbnQgY29tbWFuZCBvbiB0aGUgYnVzICovCisKKwlTY3NpX0NtbmQgKmRpc2Nvbm5lY3RlZF9TQzsKKwkJLyogY29tbWFuZHMgdGhhdCBkaXNjb25uZWN0ZWQgKi8KKworCVNjc2lfQ21uZCAqZG9uZV9TQzsKKwkJLyogY29tbWFuZCB0aGF0IHdhcyBjb21wbGV0ZWQgKi8KKworCXNwaW5sb2NrX3QgbG9jazsKKwkJLyogaG9zdCBsb2NrICovCisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJY29uc3QgY2hhciAqbG9ja2VyOworCQkvKiB3aGljaCBmdW5jdGlvbiBoYXMgdGhlIGxvY2sgKi8KKwlpbnQgbG9ja2VybDsJLyogd2hlcmUgZGlkIGl0IGdldCBpdCAqLworCisJaW50IGRlYnVnOwkvKiBjdXJyZW50IGRlYnVnZ2luZyBzZXR0aW5nICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCWludCAgICAgICAgICAgdG90YWxfY29tbWFuZHM7CisJaW50CSAgICAgIGRpc2Nvbm5lY3Rpb25zOworCWludAkgICAgICBidXNmcmVlX3dpdGhvdXRfYW55X2FjdGlvbjsKKwlpbnQJICAgICAgYnVzZnJlZV93aXRob3V0X29sZF9jb21tYW5kOworCWludAkgICAgICBidXNmcmVlX3dpdGhvdXRfbmV3X2NvbW1hbmQ7CisJaW50CSAgICAgIGJ1c2ZyZWVfd2l0aG91dF9kb25lX2NvbW1hbmQ7CisJaW50CSAgICAgIGJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb247CisJaW50ICAgICAgICAgICBjb3VudFttYXhzdGF0ZV07CisJaW50ICAgICAgICAgICBjb3VudF90cmFuc1ttYXhzdGF0ZV07CisJdW5zaWduZWQgbG9uZyB0aW1lW21heHN0YXRlXTsKKyNlbmRpZgorCisJaW50IGNvbW1hbmRzOwkJLyogY3VycmVudCBudW1iZXIgb2YgY29tbWFuZHMgKi8KKworCWludCByZWNvbm5lY3Q7CQkvKiBkaXNjb25uZWN0aW9uIGFsbG93ZWQgKi8KKwlpbnQgcGFyaXR5OwkJLyogcGFyaXR5IGNoZWNraW5nIGVuYWJsZWQgKi8KKwlpbnQgc3luY2hyb25vdXM7CS8qIHN5bmNocm9ub3VzIHRyYW5zZmVyZXMgZW5hYmxlZCAqLworCWludCBkZWxheTsJCS8qIHJlc2V0IG91dCBkZWxheSAqLworCWludCBleHRfdHJhbnM7CQkvKiBleHRlbmRlZCB0cmFuc2xhdGlvbiBlbmFibGVkICovCisKKwlpbnQgc3dpbnQ7IAkJLyogc29mdHdhcmUtaW50ZXJydXB0IHdhcyBmaXJlZCBkdXJpbmcgZGV0ZWN0KCkgKi8KKwlpbnQgc2VydmljZTsJCS8qIGJoIG5lZWRzIHRvIGJlIHJ1biAqLworCWludCBpbl9pbnRyOwkJLyogYmggaXMgcnVubmluZyAqLworCisJLyogY3VycmVudCBzdGF0ZSwKKwkgICBwcmV2aW91cyBzdGF0ZSwKKwkgICBsYXN0IHN0YXRlIGRpZmZlcmVudCBmcm9tIGN1cnJlbnQgc3RhdGUgKi8KKwllbnVtIGFoYTE1Mnhfc3RhdGUgc3RhdGUsIHByZXZzdGF0ZSwgbGFzdHN0YXRlOworCisJaW50IHRhcmdldDsKKwkJLyogcmVjb25uZWN0aW5nIHRhcmdldCAqLworCisJdW5zaWduZWQgY2hhciBzeW5jcmF0ZVs4XTsKKwkJLyogY3VycmVudCBzeW5jaHJvbm91cyB0cmFuc2ZlciBhZ3JlZW1lbnRzICovCisKKwl1bnNpZ25lZCBjaGFyIHN5bmNuZWdbOF07CisJCS8qIDA6IG5vIG5lZ290aWF0aW9uOworCQkgKiAxOiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzczsKKwkJICogMjogbmVnb3RpYXRpb24gY29tcGxldGVkCisJCSAqLworCisJaW50IGNtZF9pOworCQkvKiBudW1iZXIgb2Ygc2VudCBieXRlcyBvZiBjdXJyZW50IGNvbW1hbmQgKi8KKworCWludCBtc2dpX2xlbjsKKwkJLyogbnVtYmVyIG9mIHJlY2VpdmVkIG1lc3NhZ2UgYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyIG1zZ2lbMjU2XTsKKwkJLyogcmVjZWl2ZWQgbWVzc2FnZSBieXRlcyAqLworCisJaW50IG1zZ29faSwgbXNnb19sZW47CQorCQkvKiBudW1iZXIgb2Ygc2VudCBieXRlcyBhbmQgbGVuZ3RoIG9mIGN1cnJlbnQgbWVzc2FnZXMgKi8KKwl1bnNpZ25lZCBjaGFyIG1zZ29bMjU2XTsKKwkJLyogcGVuZGluZyBtZXNzYWdlcyAqLworCisJaW50IGRhdGFfbGVuOworCQkvKiBudW1iZXIgb2Ygc2VudC9yZWNlaXZlZCBieXRlcyBpbiBkYXRhcGhhc2UgKi8KKworCXVuc2lnbmVkIGxvbmcgaW9fcG9ydDA7CisJdW5zaWduZWQgbG9uZyBpb19wb3J0MTsKKworI2lmZGVmIF9fSVNBUE5QX18KKwlzdHJ1Y3QgcG5wX2RldiAqcG5wZGV2OworI2VuZGlmCit9OworCisKKy8qCisgKiBob3N0IHNwZWNpZmljIGNvbW1hbmQgZXh0ZW5zaW9uCisgKgorICovCitzdHJ1Y3QgYWhhMTUyeF9zY2RhdGEgeworCVNjc2lfQ21uZCAqbmV4dDsJLyogbmV4dCBzYyBpbiBxdWV1ZSAqLworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbTsJLyogc2VtYXBob3JlIHRvIGJsb2NrIG9uICovCit9OworCisKKy8qIGFjY2VzcyBtYWNyb3MgZm9yIGhvc3RkYXRhICovCisKKyNkZWZpbmUgSE9TVERBVEEoc2hwbnQpCQkoKHN0cnVjdCBhaGExNTJ4X2hvc3RkYXRhICopICZzaHBudC0+aG9zdGRhdGEpCisKKyNkZWZpbmUgSE9TVE5PCQkJKChzaHBudCktPmhvc3Rfbm8pCisKKyNkZWZpbmUgQ1VSUkVOVF9TQwkJKEhPU1REQVRBKHNocG50KS0+Y3VycmVudF9TQykKKyNkZWZpbmUgRE9ORV9TQwkJCShIT1NUREFUQShzaHBudCktPmRvbmVfU0MpCisjZGVmaW5lIElTU1VFX1NDCQkoSE9TVERBVEEoc2hwbnQpLT5pc3N1ZV9TQykKKyNkZWZpbmUgRElTQ09OTkVDVEVEX1NDCQkoSE9TVERBVEEoc2hwbnQpLT5kaXNjb25uZWN0ZWRfU0MpCisjZGVmaW5lIFFMT0NLCQkJKEhPU1REQVRBKHNocG50KS0+bG9jaykKKyNkZWZpbmUgUUxPQ0tFUgkJCShIT1NUREFUQShzaHBudCktPmxvY2tlcikKKyNkZWZpbmUgUUxPQ0tFUkwJCShIT1NUREFUQShzaHBudCktPmxvY2tlcmwpCisKKyNkZWZpbmUgU1RBVEUJCQkoSE9TVERBVEEoc2hwbnQpLT5zdGF0ZSkKKyNkZWZpbmUgUFJFVlNUQVRFCQkoSE9TVERBVEEoc2hwbnQpLT5wcmV2c3RhdGUpCisjZGVmaW5lIExBU1RTVEFURQkJKEhPU1REQVRBKHNocG50KS0+bGFzdHN0YXRlKQorCisjZGVmaW5lIFJFQ09OTl9UQVJHRVQJCShIT1NUREFUQShzaHBudCktPnRhcmdldCkKKworI2RlZmluZSBDTURfSQkJCShIT1NUREFUQShzaHBudCktPmNtZF9pKQorCisjZGVmaW5lIE1TR08oaSkJCQkoSE9TVERBVEEoc2hwbnQpLT5tc2dvW2ldKQorI2RlZmluZSBNU0dPX0kJCQkoSE9TVERBVEEoc2hwbnQpLT5tc2dvX2kpCisjZGVmaW5lIE1TR09MRU4JCQkoSE9TVERBVEEoc2hwbnQpLT5tc2dvX2xlbikKKyNkZWZpbmUgQURETVNHTyh4KQkJKE1TR09MRU48MjU2ID8gKHZvaWQpKE1TR08oTVNHT0xFTisrKT14KSA6IGFoYTE1MnhfZXJyb3Ioc2hwbnQsIk1TR08gb3ZlcmZsb3ciKSkKKworI2RlZmluZSBNU0dJKGkpCQkJKEhPU1REQVRBKHNocG50KS0+bXNnaVtpXSkKKyNkZWZpbmUgTVNHSUxFTgkJCShIT1NUREFUQShzaHBudCktPm1zZ2lfbGVuKQorI2RlZmluZSBBRERNU0dJKHgpCQkoTVNHSUxFTjwyNTYgPyAodm9pZCkoTVNHSShNU0dJTEVOKyspPXgpIDogYWhhMTUyeF9lcnJvcihzaHBudCwiTVNHSSBvdmVyZmxvdyIpKQorCisjZGVmaW5lIERBVEFfTEVOCQkoSE9TVERBVEEoc2hwbnQpLT5kYXRhX2xlbikKKworI2RlZmluZSBTWU5DUkFURQkJKEhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbQ1VSUkVOVF9TQy0+ZGV2aWNlLT5pZF0pCisjZGVmaW5lIFNZTkNORUcJCQkoSE9TVERBVEEoc2hwbnQpLT5zeW5jbmVnW0NVUlJFTlRfU0MtPmRldmljZS0+aWRdKQorCisjZGVmaW5lIERFTEFZCQkJKEhPU1REQVRBKHNocG50KS0+ZGVsYXkpCisjZGVmaW5lIEVYVF9UUkFOUwkJKEhPU1REQVRBKHNocG50KS0+ZXh0X3RyYW5zKQorI2RlZmluZSBUQzE1NTAJCQkoSE9TVERBVEEoc2hwbnQpLT50YzE1NTApCisjZGVmaW5lIFJFQ09OTkVDVAkJKEhPU1REQVRBKHNocG50KS0+cmVjb25uZWN0KQorI2RlZmluZSBQQVJJVFkJCQkoSE9TVERBVEEoc2hwbnQpLT5wYXJpdHkpCisjZGVmaW5lIFNZTkNIUk9OT1VTCQkoSE9TVERBVEEoc2hwbnQpLT5zeW5jaHJvbm91cykKKworI2RlZmluZSBIT1NUSU9QT1JUMAkJKEhPU1REQVRBKHNocG50KS0+aW9fcG9ydDApCisjZGVmaW5lIEhPU1RJT1BPUlQxCQkoSE9TVERBVEEoc2hwbnQpLT5pb19wb3J0MSkKKworI2RlZmluZSBTQ0RBVEEoU0NwbnQpCQkoKHN0cnVjdCBhaGExNTJ4X3NjZGF0YSAqKSAoU0NwbnQpLT5ob3N0X3NjcmliYmxlKQorI2RlZmluZSBTQ05FWFQoU0NwbnQpCQlTQ0RBVEEoU0NwbnQpLT5uZXh0CisjZGVmaW5lIFNDU0VNKFNDcG50KQkJU0NEQVRBKFNDcG50KS0+c2VtCisKKyNkZWZpbmUgU0dfQUREUkVTUyhidWZmZXIpCSgoY2hhciAqKSAocGFnZV9hZGRyZXNzKChidWZmZXIpLT5wYWdlKSsoYnVmZmVyKS0+b2Zmc2V0KSkKKworLyogc3RhdGUgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIHNlbGRpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBzZWxkb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgc2VsdG9fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIGJ1c2ZyZWVfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworc3RhdGljIHZvaWQgbXNnb19pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIG1zZ29fcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIG1zZ29fZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworc3RhdGljIHZvaWQgY21kX2luaXQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgY21kX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBjbWRfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworc3RhdGljIHZvaWQgZGF0YWlfaW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBkYXRhaV9ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGF0YWlfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworc3RhdGljIHZvaWQgZGF0YW9faW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBkYXRhb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgZGF0YW9fZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworc3RhdGljIHZvaWQgc3RhdHVzX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIG1zZ2lfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKK3N0YXRpYyB2b2lkIG1zZ2lfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworc3RhdGljIHZvaWQgcGFyZXJyX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCByc3RpX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKK3N0YXRpYyB2b2lkIGlzX2NvbXBsZXRlKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKKworLyoKKyAqIGRyaXZlciBzdGF0ZXMKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWNoYXIJCSpuYW1lOworCXZvaWQJCSgqaW5pdCkoc3RydWN0IFNjc2lfSG9zdCAqKTsKKwl2b2lkCQkoKnJ1bikoc3RydWN0IFNjc2lfSG9zdCAqKTsKKwl2b2lkCQkoKmVuZCkoc3RydWN0IFNjc2lfSG9zdCAqKTsKKwlpbnQJCXNwaW87Cit9IHN0YXRlc1tdID0geworCXsgImlkbGUiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCQkwfSwKKwl7ICJ1bmtub3duIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAkJMH0sCisJeyAic2VsZG8iLAlOVUxMLAkJc2VsZG9fcnVuLAlOVUxMLAkJMH0sCisJeyAic2VsZGkiLAlOVUxMLAkJc2VsZGlfcnVuLAlOVUxMLAkJMH0sCisJeyAic2VsdG8iLAlOVUxMLAkJc2VsdG9fcnVuLAlOVUxMLAkJMH0sCisJeyAiYnVzZnJlZSIsCU5VTEwsCQlidXNmcmVlX3J1biwJTlVMTCwJCTB9LAorCXsgIm1zZ28iLAltc2dvX2luaXQsCW1zZ29fcnVuLAltc2dvX2VuZCwJMX0sCisJeyAiY21kIiwJY21kX2luaXQsCWNtZF9ydW4sCWNtZF9lbmQsCTF9LAorCXsgIm1zZ2kiLAlOVUxMLAkJbXNnaV9ydW4sCW1zZ2lfZW5kLAkxfSwKKwl7ICJzdGF0dXMiLAlOVUxMLAkJc3RhdHVzX3J1biwJTlVMTCwJCTF9LAorCXsgImRhdGFpIiwJZGF0YWlfaW5pdCwJZGF0YWlfcnVuLAlkYXRhaV9lbmQsCTB9LAorCXsgImRhdGFvIiwJZGF0YW9faW5pdCwJZGF0YW9fcnVuLAlkYXRhb19lbmQsCTB9LAorCXsgInBhcmVyciIsCU5VTEwsCQlwYXJlcnJfcnVuLAlOVUxMLAkJMH0sCisJeyAicnN0aSIsCU5VTEwsCQlyc3RpX3J1biwJTlVMTCwJCTB9LAorfTsKKworLyogc2V0dXAgJiBpbnRlcnJ1cHQgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKik7CitzdGF0aWMgdm9pZCByZXNldF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBhaGExNTJ4X2Vycm9yKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICptc2cpOworc3RhdGljIHZvaWQgZG9uZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgaW50IGVycm9yKTsKKworLyogZGlhZ25vc3RpY3MgKi8KK3N0YXRpYyB2b2lkIGRpc3BfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpOworc3RhdGljIHZvaWQgc2hvd19jb21tYW5kKFNjc2lfQ21uZCAqIHB0cik7CitzdGF0aWMgdm9pZCBzaG93X3F1ZXVlcyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CitzdGF0aWMgdm9pZCBkaXNwX2VuaW50cihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCk7CisKKworLyoKKyAqICBxdWV1ZSBzZXJ2aWNlczoKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhcHBlbmRfU0MoU2NzaV9DbW5kICoqU0MsIFNjc2lfQ21uZCAqbmV3X1NDKQoreworCVNjc2lfQ21uZCAqZW5kOworCisJU0NORVhUKG5ld19TQykgPSBOVUxMOworCWlmICghKlNDKQorCQkqU0MgPSBuZXdfU0M7CisJZWxzZSB7CisJCWZvciAoZW5kID0gKlNDOyBTQ05FWFQoZW5kKTsgZW5kID0gU0NORVhUKGVuZCkpCisJCQk7CisJCVNDTkVYVChlbmQpID0gbmV3X1NDOworCX0KK30KKworc3RhdGljIGlubGluZSBTY3NpX0NtbmQgKnJlbW92ZV9maXJzdF9TQyhTY3NpX0NtbmQgKiogU0MpCit7CisJU2NzaV9DbW5kICpwdHI7CisKKwlwdHIgPSAqU0M7CisJaWYgKHB0cikgeworCQkqU0MgPSBTQ05FWFQoKlNDKTsKKwkJU0NORVhUKHB0cik9TlVMTDsKKwl9CisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGlubGluZSBTY3NpX0NtbmQgKnJlbW92ZV9sdW5fU0MoU2NzaV9DbW5kICoqIFNDLCBpbnQgdGFyZ2V0LCBpbnQgbHVuKQoreworCVNjc2lfQ21uZCAqcHRyLCAqcHJldjsKKworCWZvciAocHRyID0gKlNDLCBwcmV2ID0gTlVMTDsKKwkgICAgIHB0ciAmJiAoKHB0ci0+ZGV2aWNlLT5pZCAhPSB0YXJnZXQpIHx8IChwdHItPmRldmljZS0+bHVuICE9IGx1bikpOworCSAgICAgcHJldiA9IHB0ciwgcHRyID0gU0NORVhUKHB0cikpCisJICAgICA7CisKKwlpZiAocHRyKSB7CisJCWlmIChwcmV2KQorCQkJU0NORVhUKHByZXYpID0gU0NORVhUKHB0cik7CisJCWVsc2UKKwkJCSpTQyA9IFNDTkVYVChwdHIpOworCisJCVNDTkVYVChwdHIpPU5VTEw7CisJfQorCisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGlubGluZSBTY3NpX0NtbmQgKnJlbW92ZV9TQyhTY3NpX0NtbmQgKipTQywgU2NzaV9DbW5kICpTQ3ApCit7CisJU2NzaV9DbW5kICpwdHIsICpwcmV2OworCisJZm9yIChwdHIgPSAqU0MsIHByZXYgPSBOVUxMOworCSAgICAgcHRyICYmIFNDcCE9cHRyOworCSAgICAgcHJldiA9IHB0ciwgcHRyID0gU0NORVhUKHB0cikpCisJICAgICA7CisKKwlpZiAocHRyKSB7CisJCWlmIChwcmV2KQorCQkJU0NORVhUKHByZXYpID0gU0NORVhUKHB0cik7CisJCWVsc2UKKwkJCSpTQyA9IFNDTkVYVChwdHIpOworCisJCVNDTkVYVChwdHIpPU5VTEw7CisJfQorCisJcmV0dXJuIHB0cjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgU2NzaV9Ib3N0ICpsb29rdXBfaXJxKGludCBpcnFubykKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8QVJSQVlfU0laRShhaGExNTJ4X2hvc3QpOyBpKyspCisJCWlmKGFoYTE1MnhfaG9zdFtpXSAmJiBhaGExNTJ4X2hvc3RbaV0tPmlycT09aXJxbm8pCisJCQlyZXR1cm4gYWhhMTUyeF9ob3N0W2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzd2ludHIoaW50IGlycW5vLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gbG9va3VwX2lycShpcnFubyk7CisKKwlpZiAoIXNocG50KSB7CisgICAgICAgIAlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGNhdGNoZWQgc29mdHdhcmUgaW50ZXJydXB0ICVkIGZvciB1bmtub3duIGNvbnRyb2xsZXIuXG4iLCBpcnFubyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlIT1NUREFUQShzaHBudCktPnN3aW50Kys7CisKKwlTRVRQT1JUKERNQUNOVFJMMCwgSU5URU4pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RydWN0IFNjc2lfSG9zdCAqYWhhMTUyeF9wcm9iZV9vbmUoc3RydWN0IGFoYTE1Mnhfc2V0dXAgKnNldHVwKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50OworCisJc2hwbnQgPSBzY3NpX2hvc3RfYWxsb2MoJmFoYTE1MnhfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGFoYTE1MnhfaG9zdGRhdGEpKTsKKwlpZiAoIXNocG50KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogc2NzaV9ob3N0X2FsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIG5lZWQgdG8gaGF2ZSBob3N0IHJlZ2lzdGVyZWQgYmVmb3JlIHRyaWdnZXJpbmcgYW55IGludGVycnVwdCAqLworCWFoYTE1MnhfaG9zdFtyZWdpc3RlcmVkX2NvdW50XSA9IHNocG50OworCisJbWVtc2V0KEhPU1REQVRBKHNocG50KSwgMCwgc2l6ZW9mICpIT1NUREFUQShzaHBudCkpOworCisJc2hwbnQtPmlvX3BvcnQgICA9IHNldHVwLT5pb19wb3J0OworCXNocG50LT5uX2lvX3BvcnQgPSBJT19SQU5HRTsKKwlzaHBudC0+aXJxICAgICAgID0gc2V0dXAtPmlycTsKKworCWlmICghc2V0dXAtPnRjMTU1MCkgeworCQlIT1NUSU9QT1JUMCA9IHNldHVwLT5pb19wb3J0OworCQlIT1NUSU9QT1JUMSA9IHNldHVwLT5pb19wb3J0OworCX0gZWxzZSB7CisJCUhPU1RJT1BPUlQwID0gc2V0dXAtPmlvX3BvcnQrMHgxMDsKKwkJSE9TVElPUE9SVDEgPSBzZXR1cC0+aW9fcG9ydC0weDEwOworCX0KKworCXNwaW5fbG9ja19pbml0KCZRTE9DSyk7CisJUkVDT05ORUNUICAgPSBzZXR1cC0+cmVjb25uZWN0OworCVNZTkNIUk9OT1VTID0gc2V0dXAtPnN5bmNocm9ub3VzOworCVBBUklUWSAgICAgID0gc2V0dXAtPnBhcml0eTsKKwlERUxBWSAgICAgICA9IHNldHVwLT5kZWxheTsKKwlFWFRfVFJBTlMgICA9IHNldHVwLT5leHRfdHJhbnM7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyA9IHNldHVwLT5kZWJ1ZzsKKyNlbmRpZgorCisJU0VUUE9SVChTQ1NJSUQsIHNldHVwLT5zY3NpaWQgPDwgNCk7CisJc2hwbnQtPnRoaXNfaWQgPSBzZXR1cC0+c2NzaWlkOworCisJaWYgKHNldHVwLT5yZWNvbm5lY3QpCisJCXNocG50LT5jYW5fcXVldWUgPSBBSEExNTJYX01BWFFVRVVFOworCisJLyogUkVTRVQgT1VUICovCisJcHJpbnRrKCJhaGExNTJ4OiByZXNldHRpbmcgYnVzLi4uXG4iKTsKKwlTRVRQT1JUKFNDU0lTRVEsIFNDU0lSU1RPKTsKKwltZGVsYXkoMjU2KTsKKwlTRVRQT1JUKFNDU0lTRVEsIDApOworCW1kZWxheShERUxBWSk7CisKKwlyZXNldF9wb3J0cyhzaHBudCk7CisKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICJhaGExNTJ4JWQlczogIgorCSAgICAgICAidml0YWwgZGF0YTogcmV2PSV4LCAiCisJICAgICAgICJpbz0weCUwM2x4ICgweCUwM2x4LzB4JTAzbHgpLCAiCisJICAgICAgICJpcnE9JWQsICIKKwkgICAgICAgInNjc2lpZD0lZCwgIgorCSAgICAgICAicmVjb25uZWN0PSVzLCAiCisJICAgICAgICJwYXJpdHk9JXMsICIKKwkgICAgICAgInN5bmNocm9ub3VzPSVzLCAiCisJICAgICAgICJkZWxheT0lZCwgIgorCSAgICAgICAiZXh0ZW5kZWQgdHJhbnNsYXRpb249JXNcbiIsCisJICAgICAgIHNocG50LT5ob3N0X25vLCBzZXR1cC0+dGMxNTUwID8gIiAodGMxNTUwIG1vZGUpIiA6ICIiLAorCSAgICAgICBHRVRQT1JUKFJFVikgJiAweDcsCisJICAgICAgIHNocG50LT5pb19wb3J0LCBIT1NUSU9QT1JUMCwgSE9TVElPUE9SVDEsCisJICAgICAgIHNocG50LT5pcnEsCisJICAgICAgIHNocG50LT50aGlzX2lkLAorCSAgICAgICBSRUNPTk5FQ1QgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCSAgICAgICBQQVJJVFkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCSAgICAgICBTWU5DSFJPTk9VUyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJICAgICAgIERFTEFZLAorCSAgICAgICBFWFRfVFJBTlMgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCS8qIG5vdCBleHBlY3RpbmcgYW55IGludGVycnVwdHMgKi8KKwlTRVRQT1JUKFNJTU9ERTAsIDApOworCVNFVFBPUlQoU0lNT0RFMSwgMCk7CisKKwlpZiggcmVxdWVzdF9pcnEoc2hwbnQtPmlycSwgc3dpbnRyLCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogaXJxICVkIGJ1c3kuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKworCUhPU1REQVRBKHNocG50KS0+c3dpbnQgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeCVkOiB0cnlpbmcgc29mdHdhcmUgaW50ZXJydXB0LCAiLCBzaHBudC0+aG9zdF9ubyk7CisKKwltYigpOworCVNFVFBPUlQoRE1BQ05UUkwwLCBTV0lOVHxJTlRFTik7CisJbWRlbGF5KDEwMDApOworCWZyZWVfaXJxKHNocG50LT5pcnEsIHNocG50KTsKKworCWlmICghSE9TVERBVEEoc2hwbnQpLT5zd2ludCkgeworCQlpZiAoVEVTVEhJKERNQVNUQVQsIElOVFNUQVQpKSB7CisJCQlwcmludGsoImxvc3QuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50aygiZmFpbGVkLlxuIik7CisJCX0KKworCQlTRVRQT1JUKERNQUNOVFJMMCwgSU5URU4pOworCisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBpcnEgJWQgcG9zc2libHkgd3JvbmcuICAiCisJCQkJIlBsZWFzZSB2ZXJpZnkuXG4iLCBzaHBudC0+aG9zdF9ubywgc2hwbnQtPmlycSk7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKwlwcmludGsoIm9rLlxuIik7CisKKworCS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwlTRVRQT1JUKFNTVEFUMCwgMHg3Zik7CisJU0VUUE9SVChTU1RBVDEsIDB4ZWYpOworCisJaWYgKCByZXF1ZXN0X2lycShzaHBudC0+aXJxLCBpbnRyLCBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsICJhaGExNTJ4Iiwgc2hwbnQpICkgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1MnglZDogZmFpbGVkIHRvIHJlYXNzaWduIGlycSAlZC5cbiIsIHNocG50LT5ob3N0X25vLCBzaHBudC0+aXJxKTsKKwkJZ290byBvdXRfaG9zdF9wdXQ7CisJfQorCisJaWYoIHNjc2lfYWRkX2hvc3Qoc2hwbnQsIE5VTEwpICkgeworCQlmcmVlX2lycShzaHBudC0+aXJxLCBzaHBudCk7CisJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBmYWlsZWQgdG8gYWRkIGhvc3QuXG4iLCBzaHBudC0+aG9zdF9ubyk7CisJCWdvdG8gb3V0X2hvc3RfcHV0OworCX0KKworCXNjc2lfc2Nhbl9ob3N0KHNocG50KTsKKworCXJlZ2lzdGVyZWRfY291bnQrKzsKKworCXJldHVybiBzaHBudDsKKworb3V0X2hvc3RfcHV0OgorCWFoYTE1MnhfaG9zdFtyZWdpc3RlcmVkX2NvdW50XT1OVUxMOworCXNjc2lfaG9zdF9wdXQoc2hwbnQpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYWhhMTUyeF9yZWxlYXNlKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKCFzaHBudCkKKwkJcmV0dXJuOworCisJaWYgKHNocG50LT5pcnEpCisJCWZyZWVfaXJxKHNocG50LT5pcnEsIHNocG50KTsKKworI2lmICFkZWZpbmVkKFBDTUNJQSkKKwlpZiAoc2hwbnQtPmlvX3BvcnQpCisJCXJlbGVhc2VfcmVnaW9uKHNocG50LT5pb19wb3J0LCBJT19SQU5HRSk7CisjZW5kaWYKKworI2lmZGVmIF9fSVNBUE5QX18KKwlpZiAoSE9TVERBVEEoc2hwbnQpLT5wbnBkZXYpCisJCXBucF9kZXZpY2VfZGV0YWNoKEhPU1REQVRBKHNocG50KS0+cG5wZGV2KTsKKyNlbmRpZgorCisJc2NzaV9yZW1vdmVfaG9zdChzaHBudCk7CisJc2NzaV9ob3N0X3B1dChzaHBudCk7Cit9CisKKworLyoKKyAqIHNldHVwIGNvbnRyb2xsZXIgdG8gZ2VuZXJhdGUgaW50ZXJydXB0cyBkZXBlbmRpbmcKKyAqIG9uIGN1cnJlbnQgc3RhdGUgKGxvY2sgaGFzIHRvIGJlIGFjcXVpcmVkKQorICoKKyAqLyAKK3N0YXRpYyBpbnQgc2V0dXBfZXhwZWN0ZWRfaW50ZXJydXB0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihDVVJSRU5UX1NDKSB7CisJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSAxIDw8IDE2OworCQorCQlpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpIHsKKwkJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiZXhwZWN0aW5nOiAoc2VsZG8pIChzZWx0aW1vKSAoc2VsZGkpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCVNFVFBPUlQoU1NUQVQxLCBTRUxUTyk7CisJCQlTRVRQT1JUKFNJTU9ERTAsIEVOU0VMRE8gfCAoRElTQ09OTkVDVEVEX1NDID8gRU5TRUxESSA6IDApKTsKKwkJCVNFVFBPUlQoU0lNT0RFMSwgRU5TRUxUSU1PKTsKKwkJfSBlbHNlIHsKKwkJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiZXhwZWN0aW5nOiAocGhhc2UgY2hhbmdlKSAoYnVzZnJlZSkgJXNcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHNwaW9yZHkgPyAiKHNwaW9yZHkpIiA6ICIiKTsKKwkJCVNFVFBPUlQoU0lNT0RFMCwgKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHNwaW9yZHkpID8gRU5TUElPUkRZIDogMCk7CisJCQlTRVRQT1JUKFNJTU9ERTEsIEVOUEhBU0VNSVMgfCBFTlNDU0lSU1QgfCBFTlNDU0lQRVJSIHwgRU5CVVNGUkVFKTsgCisJCX0KKwl9IGVsc2UgaWYoU1RBVEU9PXNlbGRpKSB7CisJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiZXhwZWN0aW5nOiAocGhhc2UgY2hhbmdlKSAoaWRlbnRpZnkpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJU0VUUE9SVChTSU1PREUwLCAwKTsKKwkJU0VUUE9SVChTSU1PREUxLCBFTlBIQVNFTUlTIHwgRU5TQ1NJUlNUIHwgRU5TQ1NJUEVSUiB8IEVOQlVTRlJFRSk7IAorCX0gZWxzZSB7CisJCURQUklOVEsoZGVidWdfaW50ciwgREVCVUdfTEVBRCAiZXhwZWN0aW5nOiAlcyAlc1xuIiwKKwkJCUNNRElORk8oQ1VSUkVOVF9TQyksCisJCQlESVNDT05ORUNURURfU0MgPyAiKHJlc2VsZWN0aW9uKSIgOiAiIiwKKwkJCUlTU1VFX1NDID8gIihidXNmcmVlKSIgOiAiIik7CisJCVNFVFBPUlQoU0lNT0RFMCwgRElTQ09OTkVDVEVEX1NDID8gRU5TRUxESSA6IDApOworCQlTRVRQT1JUKFNJTU9ERTEsIEVOU0NTSVJTVCB8ICggKElTU1VFX1NDfHxET05FX1NDKSA/IEVOQlVTRlJFRSA6IDApKTsKKwl9CisKKwlpZighSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKQorCQlTRVRCSVRTKERNQUNOVFJMMCwgSU5URU4pOworCisJcmV0dXJuIFRFU1RISShETUFTVEFULCBJTlRTVEFUKTsKK30KKworCisvKiAKKyAqICBRdWV1ZSBhIGNvbW1hbmQgYW5kIHNldHVwIGludGVycnVwdHMgZm9yIGEgZnJlZSBidXMuCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9pbnRlcm5hbF9xdWV1ZShTY3NpX0NtbmQgKlNDcG50LCBzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sIGludCBwaGFzZSwgdm9pZCAoKmRvbmUpKFNjc2lfQ21uZCAqKSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX3F1ZXVlKSB7CisJCXByaW50ayhJTkZPX0xFQUQgInF1ZXVlOiAlcDsgY21kX2xlbj0lZCBwaWVjZXM9JWQgc2l6ZT0ldSBjbW5kPSIsCisJCSAgICAgICBDTURJTkZPKFNDcG50KSwgU0NwbnQsIFNDcG50LT5jbWRfbGVuLCBTQ3BudC0+dXNlX3NnLCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuKTsKKwkJcHJpbnRfY29tbWFuZChTQ3BudC0+Y21uZCk7CisJfQorI2VuZGlmCisKKwlTQ3BudC0+c2NzaV9kb25lCT0gZG9uZTsKKwlTQ3BudC0+cmVzaWQgCQk9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisJU0NwbnQtPlNDcC5waGFzZQk9IG5vdF9pc3N1ZWQgfCBwaGFzZTsKKwlTQ3BudC0+U0NwLlN0YXR1cwk9IENIRUNLX0NPTkRJVElPTjsKKwlTQ3BudC0+U0NwLk1lc3NhZ2UJPSAwOworCVNDcG50LT5TQ3AuaGF2ZV9kYXRhX2luCT0gMDsKKwlTQ3BudC0+U0NwLnNlbnRfY29tbWFuZAk9IDA7CisKKwlpZihTQ3BudC0+U0NwLnBoYXNlICYgKHJlc2V0dGluZ3xjaGVja19jb25kaXRpb24pKSB7CisJCWlmKFNDcG50LT5ob3N0X3NjcmliYmxlPT0wIHx8IFNDU0VNKFNDcG50KSB8fCBTQ05FWFQoU0NwbnQpKSB7CisJCQlwcmludGsoRVJSX0xFQUQgImNhbm5vdCByZXVzZSBjb21tYW5kXG4iLCBDTURJTkZPKFNDcG50KSk7CisJCQlyZXR1cm4gRkFJTEVEOworCQl9CisJfSBlbHNlIHsKKwkJU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWhhMTUyeF9zY2RhdGEpLCBHRlBfQVRPTUlDKTsKKwkJaWYoU0NwbnQtPmhvc3Rfc2NyaWJibGU9PTApIHsKKwkJCXByaW50ayhFUlJfTEVBRCAiYWxsb2NhdGlvbiBmYWlsZWRcbiIsIENNRElORk8oU0NwbnQpKTsKKwkJCXJldHVybiBGQUlMRUQ7CisJCX0KKwl9CisKKwlTQ05FWFQoU0NwbnQpCQk9IE5VTEw7CisJU0NTRU0oU0NwbnQpCQk9IHNlbTsKKworCS8qIHNldHVwIHNjcmF0Y2ggYXJlYQorCSAgIFNDcC5wdHIgICAgICAgICAgICAgIDogYnVmZmVyIHBvaW50ZXIKKwkgICBTQ3AudGhpc19yZXNpZHVhbCAgICA6IGJ1ZmZlciBsZW5ndGgKKwkgICBTQ3AuYnVmZmVyICAgICAgICAgICA6IG5leHQgYnVmZmVyCisJICAgU0NwLmJ1ZmZlcnNfcmVzaWR1YWwgOiBsZWZ0IGJ1ZmZlcnMgaW4gbGlzdAorCSAgIFNDcC5waGFzZSAgICAgICAgICAgIDogY3VycmVudCBzdGF0ZSBvZiB0aGUgY29tbWFuZCAqLworCWlmIChTQ3BudC0+dXNlX3NnKSB7CisJCVNDcG50LT5TQ3AuYnVmZmVyICAgICAgICAgICA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQlTQ3BudC0+U0NwLnB0ciAgICAgICAgICAgICAgPSBTR19BRERSRVNTKFNDcG50LT5TQ3AuYnVmZmVyKTsKKwkJU0NwbnQtPlNDcC50aGlzX3Jlc2lkdWFsICAgID0gU0NwbnQtPlNDcC5idWZmZXItPmxlbmd0aDsKKwkJU0NwbnQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsID0gU0NwbnQtPnVzZV9zZyAtIDE7CisJfSBlbHNlIHsKKwkJU0NwbnQtPlNDcC5wdHIgICAgICAgICAgICAgID0gKGNoYXIgKikgU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQlTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwgICAgPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOworCQlTQ3BudC0+U0NwLmJ1ZmZlciAgICAgICAgICAgPSBOVUxMOworCQlTQ3BudC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOworCX0KKworCURPX0xPQ0soZmxhZ3MpOworCisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJSE9TVERBVEEoc2hwbnQpLT50b3RhbF9jb21tYW5kcysrOworI2VuZGlmCisKKwkvKiBUdXJuIGxlZCBvbiwgd2hlbiB0aGlzIGlzIHRoZSBmaXJzdCBjb21tYW5kLiAqLworCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMrKzsKKwlpZiAoSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcz09MSkKKwkJU0VUUE9SVChQT1JUQSwgMSk7CisKKwlhcHBlbmRfU0MoJklTU1VFX1NDLCBTQ3BudCk7CisKKwlpZighSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKQorCQlzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKKworCURPX1VOTE9DSyhmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBxdWV1ZSBhIGNvbW1hbmQKKyAqCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9xdWV1ZShTY3NpX0NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoU2NzaV9DbW5kICopKQoreworI2lmIDAKKwlpZigqU0NwbnQtPmNtbmQgPT0gUkVRVUVTVF9TRU5TRSkgeworCQlTQ3BudC0+cmVzdWx0ID0gMDsKKwkJZG9uZShTQ3BudCk7CisKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gYWhhMTUyeF9pbnRlcm5hbF9xdWV1ZShTQ3BudCwgTlVMTCwgMCwgZG9uZSk7Cit9CisKKworLyoKKyAqICAKKyAqCisgKi8KK3N0YXRpYyB2b2lkIHJlc2V0X2RvbmUoU2NzaV9DbW5kICpTQ3BudCkKK3sKKyNpZiAwCisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+aG9zdDsKKwlEUFJJTlRLKGRlYnVnX2VoLCBJTkZPX0xFQUQgInJlc2V0X2RvbmUgY2FsbGVkXG4iLCBDTURJTkZPKFNDcG50KSk7CisjZW5kaWYKKwlpZihTQ1NFTShTQ3BudCkpIHsKKwkJdXAoU0NTRU0oU0NwbnQpKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IHJlc2V0X2RvbmUgdy9vIHNlbWFwaG9yZVxuIik7CisJfQorfQorCisvKgorICogIEFib3J0IGEgY29tbWFuZAorICoKKyAqLworc3RhdGljIGludCBhaGExNTJ4X2Fib3J0KFNjc2lfQ21uZCAqU0NwbnQpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworCVNjc2lfQ21uZCAqcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CisJCXByaW50ayhERUJVR19MRUFEICJhYm9ydCglcCkiLCBDTURJTkZPKFNDcG50KSwgU0NwbnQpOworCQlzaG93X3F1ZXVlcyhzaHBudCk7CisJfQorI2VuZGlmCisKKwlET19MT0NLKGZsYWdzKTsKKworCXB0cj1yZW1vdmVfU0MoJklTU1VFX1NDLCBTQ3BudCk7CisKKwlpZihwdHIpIHsKKwkJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAibm90IHlldCBpc3N1ZWQgLSBTVUNDRVNTXG4iLCBDTURJTkZPKFNDcG50KSk7CisKKwkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOworCQlpZiAoIUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMpCisJCQlTRVRQT1JUKFBPUlRBLCAwKTsKKwkJRE9fVU5MT0NLKGZsYWdzKTsKKworCQlrZnJlZShTQ3BudC0+aG9zdF9zY3JpYmJsZSk7CisJCVNDcG50LT5ob3N0X3NjcmliYmxlPU5VTEw7CisKKwkJcmV0dXJuIFNVQ0NFU1M7CisJfSAKKworCURPX1VOTE9DSyhmbGFncyk7CisKKwkvKgorCSAqIEZJWE1FOgorCSAqIGZvciBjdXJyZW50IGNvbW1hbmQ6IHF1ZXVlIEFCT1JUIGZvciBtZXNzYWdlIG91dCBhbmQgcmFpc2UgQVROCisJICogZm9yIGRpc2Nvbm5lY3RlZCBjb21tYW5kOiBwc2V1ZG8gU0Mgd2l0aCBBQk9SVCBtZXNzYWdlIG9yIEFCT1JUIG9uIHJlc2VsZWN0aW9uPworCSAqCisJICovCisKKwlwcmludGsoRVJSX0xFQUQgImNhbm5vdCBhYm9ydCBydW5uaW5nIG9yIGRpc2Nvbm5lY3RlZCBjb21tYW5kXG4iLCBDTURJTkZPKFNDcG50KSk7CisKKwlyZXR1cm4gRkFJTEVEOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgcCkKK3sKKwlTY3NpX0NtbmQJICpTQ3AgICA9IChTY3NpX0NtbmQgKilwOworCXN0cnVjdCBzZW1hcGhvcmUgKnNlbSAgID0gU0NTRU0oU0NwKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IFNDcC0+ZGV2aWNlLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiByZW1vdmUgY29tbWFuZCBmcm9tIGlzc3VlIHF1ZXVlICovCisJRE9fTE9DSyhmbGFncyk7CisJcmVtb3ZlX1NDKCZJU1NVRV9TQywgU0NwKTsKKwlET19VTkxPQ0soZmxhZ3MpOworCisJdXAoc2VtKTsKK30KKworLyoKKyAqIFJlc2V0IGEgZGV2aWNlCisgKgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfZGV2aWNlX3Jlc2V0KFNjc2lfQ21uZCAqIFNDcG50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwlERUNMQVJFX01VVEVYX0xPQ0tFRChzZW0pOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCWludCByZXQsIGlzc3VlZCwgZGlzY29ubmVjdGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CisJCXByaW50ayhJTkZPX0xFQUQgImFoYTE1MnhfZGV2aWNlX3Jlc2V0KCVwKSIsIENNRElORk8oU0NwbnQpLCBTQ3BudCk7CisJCXNob3dfcXVldWVzKHNocG50KTsKKwl9CisjZW5kaWYKKworCWlmKENVUlJFTlRfU0M9PVNDcG50KSB7CisJCXByaW50ayhFUlJfTEVBRCAiY2Fubm90IHJlc2V0IGN1cnJlbnQgZGV2aWNlXG4iLCBDTURJTkZPKFNDcG50KSk7CisJCXJldHVybiBGQUlMRUQ7CisJfQorCisJRE9fTE9DSyhmbGFncyk7CisJaXNzdWVkICAgICAgID0gcmVtb3ZlX1NDKCZJU1NVRV9TQywgU0NwbnQpPT0wOworCWRpc2Nvbm5lY3RlZCA9IGlzc3VlZCAmJiByZW1vdmVfU0MoJkRJU0NPTk5FQ1RFRF9TQywgU0NwbnQpOworCURPX1VOTE9DSyhmbGFncyk7CisKKwlTQ3BudC0+Y21kX2xlbiAgICAgICAgID0gMDsKKwlTQ3BudC0+dXNlX3NnICAgICAgICAgID0gMDsKKwlTQ3BudC0+cmVxdWVzdF9idWZmZXIgID0gTlVMTDsKKwlTQ3BudC0+cmVxdWVzdF9idWZmbGVuID0gMDsKKworCWluaXRfdGltZXIoJnRpbWVyKTsKKwl0aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKSBTQ3BudDsKKwl0aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyAxMDAqSFo7ICAgLyogMTBzICovCisJdGltZXIuZnVuY3Rpb24gPSAodm9pZCAoKikodW5zaWduZWQgbG9uZykpIHRpbWVyX2V4cGlyZWQ7CisKKwlhaGExNTJ4X2ludGVybmFsX3F1ZXVlKFNDcG50LCAmc2VtLCByZXNldHRpbmcsIHJlc2V0X2RvbmUpOworCWFkZF90aW1lcigmdGltZXIpOworCWRvd24oJnNlbSk7CisJZGVsX3RpbWVyKCZ0aW1lcik7CisJCisJU0NwbnQtPmNtZF9sZW4gICAgICAgICA9IFNDcG50LT5vbGRfY21kX2xlbjsKKwlTQ3BudC0+dXNlX3NnICAgICAgICAgID0gU0NwbnQtPm9sZF91c2Vfc2c7CisgIAlTQ3BudC0+cmVxdWVzdF9idWZmZXIgID0gU0NwbnQtPmJ1ZmZlcjsKKyAgICAgICAJU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiA9IFNDcG50LT5idWZmbGVuOworCisJRE9fTE9DSyhmbGFncyk7CisKKwlpZihTQ3BudC0+U0NwLnBoYXNlICYgcmVzZXR0ZWQpIHsKKwkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOworCQlpZiAoIUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMpCisJCQlTRVRQT1JUKFBPUlRBLCAwKTsKKwkJa2ZyZWUoU0NwbnQtPmhvc3Rfc2NyaWJibGUpOworCQlTQ3BudC0+aG9zdF9zY3JpYmJsZT1OVUxMOworCisJCXJldCA9IFNVQ0NFU1M7CisJfSBlbHNlIHsKKwkJLyogcmVxdWV1ZSAqLworCQlpZighaXNzdWVkKSB7CisJCQlhcHBlbmRfU0MoJklTU1VFX1NDLCBTQ3BudCk7CisJCX0gZWxzZSBpZihkaXNjb25uZWN0ZWQpIHsKKwkJCWFwcGVuZF9TQygmRElTQ09OTkVDVEVEX1NDLCBTQ3BudCk7CisJCX0KKwkKKwkJcmV0ID0gRkFJTEVEOworCX0KKworCURPX1VOTE9DSyhmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxKHNocG50LT5ob3N0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaGFyZF9yZXNldF9TQ3Moc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIFNjc2lfQ21uZCAqKlNDcykKK3sKKwlTY3NpX0NtbmQgKnB0cjsKKworCXB0cj0qU0NzOworCXdoaWxlKHB0cikgeworCQlTY3NpX0NtbmQgKm5leHQ7CisKKwkJaWYoU0NEQVRBKHB0cikpIHsKKwkJCW5leHQgPSBTQ05FWFQocHRyKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhERUJVR19MRUFEICJxdWV1ZSBjb3JydXB0ZWQgYXQgJXBcbiIsIENNRElORk8ocHRyKSwgcHRyKTsKKwkJCW5leHQgPSBOVUxMOworCQl9CisKKwkJaWYgKCFwdHItPmRldmljZS0+c29mdF9yZXNldCkgeworCQkJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAiZGlzY29ubmVjdGVkIGNvbW1hbmQgJXAgcmVtb3ZlZFxuIiwgQ01ESU5GTyhwdHIpLCBwdHIpOworCQkJcmVtb3ZlX1NDKFNDcywgcHRyKTsKKwkJCUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMtLTsKKwkJCWtmcmVlKHB0ci0+aG9zdF9zY3JpYmJsZSk7CisJCQlwdHItPmhvc3Rfc2NyaWJibGU9TlVMTDsKKwkJfQorCisJCXB0ciA9IG5leHQ7CisJfQorfQorCisvKgorICogUmVzZXQgdGhlIGJ1cworICoKKyAqLworc3RhdGljIGludCBhaGExNTJ4X2J1c19yZXNldChTY3NpX0NtbmQgKlNDcG50KQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRE9fTE9DSyhmbGFncyk7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaWYoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX2VoKSB7CisJCXByaW50ayhERUJVR19MRUFEICJhaGExNTJ4X2J1c19yZXNldCglcCkiLCBDTURJTkZPKFNDcG50KSwgU0NwbnQpOworCQlzaG93X3F1ZXVlcyhzaHBudCk7CisJfQorI2VuZGlmCisKKwlmcmVlX2hhcmRfcmVzZXRfU0NzKHNocG50LCAmSVNTVUVfU0MpOworCWZyZWVfaGFyZF9yZXNldF9TQ3Moc2hwbnQsICZESVNDT05ORUNURURfU0MpOworCisJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAicmVzZXR0aW5nIGJ1c1xuIiwgQ01ESU5GTyhTQ3BudCkpOworCisJU0VUUE9SVChTQ1NJU0VRLCBTQ1NJUlNUTyk7CisJbWRlbGF5KDI1Nik7CisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKwltZGVsYXkoREVMQVkpOworCisJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAiYnVzIHJlc2V0dGVkXG4iLCBDTURJTkZPKFNDcG50KSk7CisKKwlzZXR1cF9leHBlY3RlZF9pbnRlcnJ1cHRzKHNocG50KTsKKwlpZihIT1NUREFUQShzaHBudCktPmNvbW1hbmRzPT0wKQorCQlTRVRQT1JUKFBPUlRBLCAwKTsKKworCURPX1VOTE9DSyhmbGFncyk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworCisvKgorICogIFJlc3RvcmUgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIEFJQy02MjYwIHJlZ2lzdGVycyBhbmQgcmVzZXQgdGhlIGZpZm9zCisgKgorICovCitzdGF0aWMgdm9pZCByZXNldF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJU0VUUE9SVChETUFDTlRSTDAsIFJTVEZJRk8pOworCisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKworCVNFVFBPUlQoU1hGUkNUTDEsIDApOworCVNFVFBPUlQoU0NTSVNJRywgMCk7CisJU0VUUkFURSgwKTsKKworCS8qIGNsZWFyIGFsbCBpbnRlcnJ1cHQgY29uZGl0aW9ucyAqLworCVNFVFBPUlQoU1NUQVQwLCAweDdmKTsKKwlTRVRQT1JUKFNTVEFUMSwgMHhlZik7CisKKwlTRVRQT1JUKFNTVEFUNCwgU1lOQ0VSUiB8IEZXRVJSIHwgRlJFUlIpOworCisJU0VUUE9SVChETUFDTlRSTDAsIDApOworCVNFVFBPUlQoRE1BQ05UUkwxLCAwKTsKKworCVNFVFBPUlQoQlJTVENOVFJMLCAweGYxKTsKKworCS8qIGNsZWFyIFNDU0kgZmlmb3MgYW5kIHRyYW5zZmVyIGNvdW50ICovCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUkNIMXxDTFJTVENOVCk7CisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxKTsKKworCURPX0xPQ0soZmxhZ3MpOworCXNldHVwX2V4cGVjdGVkX2ludGVycnVwdHMoc2hwbnQpOworCURPX1VOTE9DSyhmbGFncyk7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgaG9zdCAoYnVzIGFuZCBjb250cm9sbGVyKQorICoKKyAqLworaW50IGFoYTE1MnhfaG9zdF9yZXNldChTY3NpX0NtbmQgKiBTQ3BudCkKK3sKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBTQ3BudC0+ZGV2aWNlLT5ob3N0OworI2VuZGlmCisKKwlEUFJJTlRLKGRlYnVnX2VoLCBERUJVR19MRUFEICJhaGExNTJ4X2hvc3RfcmVzZXQoJXApXG4iLCBDTURJTkZPKFNDcG50KSwgU0NwbnQpOworCisJYWhhMTUyeF9idXNfcmVzZXQoU0NwbnQpOworCisJRFBSSU5USyhkZWJ1Z19laCwgREVCVUdfTEVBRCAicmVzZXR0aW5nIHBvcnRzXG4iLCBDTURJTkZPKFNDcG50KSk7CisJcmVzZXRfcG9ydHMoU0NwbnQtPmRldmljZS0+aG9zdCk7CisKKwlyZXR1cm4gU1VDQ0VTUzsKK30KKworLyoKKyAqIFJldHVybiB0aGUgImxvZ2ljYWwgZ2VvbWV0cnkiCisgKgorICovCitzdGF0aWMgaW50IGFoYTE1MnhfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaW5mb19hcnJheSkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IHNkZXYtPmhvc3Q7CisKKwkvKiB0cnkgZGVmYXVsdCB0cmFuc2xhdGlvbiAqLworCWluZm9fYXJyYXlbMF0gPSA2NDsKKwlpbmZvX2FycmF5WzFdID0gMzI7CisJaW5mb19hcnJheVsyXSA9ICh1bnNpZ25lZCBsb25nKWNhcGFjaXR5IC8gKDY0ICogMzIpOworCisJLyogZm9yIGRpc2tzID4xR0IgZG8gc29tZSBndWVzc2luZyAqLworCWlmIChpbmZvX2FycmF5WzJdID49IDEwMjQpIHsKKwkJaW50IGluZm9bM107CisKKwkJLyogdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIGdlb21ldHJ5IGZyb20gdGhlIHBhcnRpdGlvbiB0YWJsZSAqLworCQlpZiAoc2NzaWNhbV9iaW9zX3BhcmFtKGJkZXYsIGNhcGFjaXR5LCBpbmZvKSA8IDAgfHwKKwkJICAgICEoKGluZm9bMF0gPT0gNjQgJiYgaW5mb1sxXSA9PSAzMikgfHwgKGluZm9bMF0gPT0gMjU1ICYmIGluZm9bMV0gPT0gNjMpKSkgeworCQkJaWYgKEVYVF9UUkFOUykgeworCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCSAgICAgICAiYWhhMTUyeDogdW5hYmxlIHRvIHZlcmlmeSBnZW9tZXRyeSBmb3IgZGlzayB3aXRoID4xR0IuXG4iCisJCQkJICAgICAgICIgICAgICAgICB1c2luZyBleHRlbmRlZCB0cmFuc2xhdGlvbi5cbiIpOworCQkJCWluZm9fYXJyYXlbMF0gPSAyNTU7CisJCQkJaW5mb19hcnJheVsxXSA9IDYzOworCQkJCWluZm9fYXJyYXlbMl0gPSAodW5zaWduZWQgbG9uZyljYXBhY2l0eSAvICgyNTUgKiA2Myk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX05PVElDRQorCQkJCSAgICAgICAiYWhhMTUyeDogdW5hYmxlIHRvIHZlcmlmeSBnZW9tZXRyeSBmb3IgZGlzayB3aXRoID4xR0IuXG4iCisJCQkJICAgICAgICIgICAgICAgICBVc2luZyBkZWZhdWx0IHRyYW5zbGF0aW9uLiBQbGVhc2UgdmVyaWZ5IHlvdXJzZWxmLlxuIgorCQkJCSAgICAgICAiICAgICAgICAgUGVyaGFwcyB5b3UgbmVlZCB0byBlbmFibGUgZXh0ZW5kZWQgdHJhbnNsYXRpb24gaW4gdGhlIGRyaXZlci5cbiIKKwkJCQkgICAgICAgIiAgICAgICAgIFNlZSBEb2N1bWVudGF0aW9uL3Njc2kvYWhhMTUyeC50eHQgZm9yIGRldGFpbHMuXG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWluZm9fYXJyYXlbMF0gPSBpbmZvWzBdOworCQkJaW5mb19hcnJheVsxXSA9IGluZm9bMV07CisJCQlpbmZvX2FycmF5WzJdID0gaW5mb1syXTsKKworCQkJaWYgKGluZm9bMF0gPT0gMjU1ICYmICFFWFRfVFJBTlMpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkgICAgICAgImFoYTE1Mng6IGN1cnJlbnQgcGFydGl0aW9uIHRhYmxlIGlzIHVzaW5nIGV4dGVuZGVkIHRyYW5zbGF0aW9uLlxuIgorCQkJCSAgICAgICAiICAgICAgICAgdXNpbmcgaXQgYWxzbywgYWx0aG91Z2ggaXQncyBub3QgZXhwbGljaXRseSBlbmFibGVkLlxuIik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBJbnRlcm5hbCBkb25lIGZ1bmN0aW9uCisgKgorICovCitzdGF0aWMgdm9pZCBkb25lKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBpbnQgZXJyb3IpCit7CisJaWYgKENVUlJFTlRfU0MpIHsKKwkJaWYoRE9ORV9TQykKKwkJCXByaW50ayhFUlJfTEVBRCAidGhlcmUncyBhbHJlYWR5IGEgY29tcGxldGVkIGNvbW1hbmQgJXAgLSB3aWxsIGNhdXNlIGFib3J0XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBET05FX1NDKTsKKworCQlET05FX1NDID0gQ1VSUkVOVF9TQzsKKwkJQ1VSUkVOVF9TQyA9IE5VTEw7CisJCURPTkVfU0MtPnJlc3VsdCA9IGVycm9yOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGRvbmUoKSBjYWxsZWQgb3V0c2lkZSBvZiBjb21tYW5kXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBhaGExNTJ4X3RxOworCisvKgorICogUnVuIHNlcnZpY2UgY29tcGxldGlvbnMgb24gdGhlIGNhcmQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBydW4odm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpPEFSUkFZX1NJWkUoYWhhMTUyeF9ob3N0KTsgaSsrKSB7CisJCXN0cnVjdCBTY3NpX0hvc3QgKnNocG50ID0gYWhhMTUyeF9ob3N0W2ldOworCQlpZiAoc2hwbnQgJiYgSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlKSB7CisJCQlIT1NUREFUQShzaHBudCktPnNlcnZpY2U9MDsKKwkJCWlzX2NvbXBsZXRlKHNocG50KTsKKwkJfQorCX0KK30KKworLyoKKyAqICAgIEludGVycnVwdHMgaGFuZGxlcgorICoKKyAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50cihpbnQgaXJxbm8sIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQgPSBsb29rdXBfaXJxKGlycW5vKTsKKwl1bnNpZ25lZCBjaGFyIHJldiwgZG1hY250cmwwOworCisJaWYgKCFzaHBudCkgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGNhdGNoZWQgaW50ZXJydXB0ICVkIGZvciB1bmtub3duIGNvbnRyb2xsZXIuXG4iLCBpcnFubyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKgorCSAqIFJlYWQgYSBjb3VwbGUgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBiZSBhbGwgMSdzLiBJZgorCSAqIHdlIHJlYWQgYWxsIDEncyAoLTEpLCB0aGF0IG1lYW5zIHRoYXQgZWl0aGVyOgorCSAqCisJICogYS4gVGhlIGhvc3QgYWRhcHRlciBjaGlwIGhhcyBnb25lIGJhZCwgYW5kIHdlIGNhbm5vdCBjb250cm9sIGl0LAorCSAqCU9SCisJICogYi4gVGhlIGhvc3QgYWRhcHRlciBpcyBhIFBDTUNJQSBjYXJkIHRoYXQgaGFzIGJlZW4gZWplY3RlZAorCSAqCisJICogSW4gZWl0aGVyIGNhc2UsIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHRoZSBob3N0IGFkYXB0ZXIgYXQKKwkgKiB0aGlzIHBvaW50IGluIHRpbWUuIFNvIGp1c3QgaWdub3JlIHRoZSBpbnRlcnJ1cHQgYW5kIHJldHVybi4KKwkgKiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBpbnRlcnJ1cHQgbWlnaHQgYWN0dWFsbHkgYmUgbWVhbnQgZm9yCisJICogc29tZW9uZSBlbHNlIHNoYXJpbmcgdGhpcyBJUlEsIGFuZCB0aGF0IGRyaXZlciB3aWxsIGhhbmRsZSBpdC4KKwkgKi8KKwlyZXYgPSBHRVRQT1JUKFJFVik7CisJZG1hY250cmwwID0gR0VUUE9SVChETUFDTlRSTDApOworCWlmICgocmV2ID09IDB4RkYpICYmIChkbWFjbnRybDAgPT0gMHhGRikpCisJCXJldHVybiBJUlFfTk9ORTsKKworCS8qIG5vIG1vcmUgaW50ZXJydXB0cyBmcm9tIHRoZSBjb250cm9sbGVyLCB3aGlsZSB3ZSdyZSBidXN5LgorCSAgIElOVEVOIGlzIHJlc3RvcmVkIGJ5IHRoZSBCSCBoYW5kbGVyICovCisJQ0xSQklUUyhETUFDTlRSTDAsIElOVEVOKTsKKworI2lmIDAKKwkvKiBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IHNvbWV0aGluZyB0byBiZQorICAgICAgICAgICBzZXJ2aWNlZDsgc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwlpZihIT1NUREFUQShzaHBudCktPnNlcnZpY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IGxvc3QgaW50ZXJydXB0ICglZClcbiIsIEhPU1ROTywgSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlKTsKKwkgICAgICAgIHNob3dfcXVldWVzKHNocG50KTsKKwl9CisjZW5kaWYKKwkKKwkvKiBQb2tlIHRoZSBCSCBoYW5kbGVyICovCisJSE9TVERBVEEoc2hwbnQpLT5zZXJ2aWNlKys7CisJSU5JVF9XT1JLKCZhaGExNTJ4X3RxLCAodm9pZCAqKSBydW4sIE5VTEwpOworCXNjaGVkdWxlX3dvcmsoJmFoYTE1MnhfdHEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIGJ1c2ZyZWUgcGhhc2UKKyAqIC0gaGFuZGxlIGNvbXBsZXRpdGlvbi9kaXNjb25uZWN0aW9uL2Vycm9yIG9mIGN1cnJlbnQgY29tbWFuZAorICogLSBzdGFydCBzZWxlY3Rpb24gZm9yIG5leHQgY29tbWFuZCAoaWYgYW55KQorICovCitzdGF0aWMgdm9pZCBidXNmcmVlX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCWludCBhY3Rpb249MDsKKyNlbmRpZgorCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUkNIMXxDTFJTVENOVCk7CisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxKTsKKworCVNFVFBPUlQoU1NUQVQxLCBDTFJCVVNGUkVFKTsKKwkKKwlpZihDVVJSRU5UX1NDKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCWFjdGlvbisrOworI2VuZGlmCisJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+c3luY25lZzsKKworCQlpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBjb21wbGV0ZWQpIHsKKwkJCS8qIHRhcmdldCBzZW50IENPTU1BTkQgQ09NUExFVEUgKi8KKwkJCWRvbmUoc2hwbnQsIChDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzICYgMHhmZikgfCAoKENVUlJFTlRfU0MtPlNDcC5NZXNzYWdlICYgMHhmZikgPDwgOCkgfCAoRElEX09LIDw8IDE2KSk7CisKKwkJfSBlbHNlIGlmKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIGFib3J0ZWQpIHsKKwkJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgIkFCT1JUIHNlbnRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJZG9uZShzaHBudCwgKENVUlJFTlRfU0MtPlNDcC5TdGF0dXMgJiAweGZmKSB8ICgoQ1VSUkVOVF9TQy0+U0NwLk1lc3NhZ2UgJiAweGZmKSA8PCA4KSB8IChESURfQUJPUlQgPDwgMTYpKTsKKworCQl9IGVsc2UgaWYoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgcmVzZXR0ZWQpIHsKKwkJCURQUklOVEsoZGVidWdfZWgsIERFQlVHX0xFQUQgIkJVUyBERVZJQ0UgUkVTRVQgc2VudFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlkb25lKHNocG50LCAoQ1VSUkVOVF9TQy0+U0NwLlN0YXR1cyAmIDB4ZmYpIHwgKChDVVJSRU5UX1NDLT5TQ3AuTWVzc2FnZSAmIDB4ZmYpIDw8IDgpIHwgKERJRF9SRVNFVCA8PCAxNikpOworCisJCX0gZWxzZSBpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBkaXNjb25uZWN0ZWQpIHsKKwkJCS8qIHRhcmdldCBzZW50IERJU0NPTk5FQ1QgKi8KKwkJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJ0YXJnZXQgZGlzY29ubmVjdGVkIGF0ICVkLyVkXG4iLAorCQkJCUNNRElORk8oQ1VSUkVOVF9TQyksCisJCQkJQ1VSUkVOVF9TQy0+cmVzaWQsCisJCQkJQ1VSUkVOVF9TQy0+cmVxdWVzdF9idWZmbGVuKTsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwkJCUhPU1REQVRBKHNocG50KS0+ZGlzY29ubmVjdGlvbnMrKzsKKyNlbmRpZgorCQkJYXBwZW5kX1NDKCZESVNDT05ORUNURURfU0MsIENVUlJFTlRfU0MpOworCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IDEgPDwgMTY7CisJCQlDVVJSRU5UX1NDID0gTlVMTDsKKworCQl9IGVsc2UgeworCQkJZG9uZShzaHBudCwgRElEX0VSUk9SIDw8IDE2KTsKKwkJfQorI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCX0gZWxzZSB7CisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X29sZF9jb21tYW5kKys7CisjZW5kaWYKKwl9CisKKwlET19MT0NLKGZsYWdzKTsKKworCWlmKERPTkVfU0MpIHsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwkJYWN0aW9uKys7CisjZW5kaWYKKworCQlpZihET05FX1NDLT5TQ3AucGhhc2UgJiBjaGVja19jb25kaXRpb24pIHsKKyNpZiAwCisJCQlpZihIT1NUREFUQShzaHBudCktPmRlYnVnICYgZGVidWdfZWgpIHsKKwkJCQlwcmludGsoRVJSX0xFQUQgInJlY2VpdmVkIHNlbnNlOiAiLCBDTURJTkZPKERPTkVfU0MpKTsKKwkJCQlwcmludF9zZW5zZSgiYmgiLCBET05FX1NDKTsKKwkJCX0KKyNlbmRpZgorCisJCQkvKiByZXN0b3JlIG9sZCBjb21tYW5kICovCisJCQltZW1jcHkoKHZvaWQgKikgRE9ORV9TQy0+Y21uZCwgKHZvaWQgKikgRE9ORV9TQy0+ZGF0YV9jbW5kLCBzaXplb2YoRE9ORV9TQy0+ZGF0YV9jbW5kKSk7CisJCQlET05FX1NDLT5yZXF1ZXN0X2J1ZmZlciAgPSBET05FX1NDLT5idWZmZXI7CisJCQlET05FX1NDLT5yZXF1ZXN0X2J1ZmZsZW4gPSBET05FX1NDLT5idWZmbGVuOworCQkJRE9ORV9TQy0+dXNlX3NnICAgICAgICAgID0gRE9ORV9TQy0+b2xkX3VzZV9zZzsKKwkJCURPTkVfU0MtPmNtZF9sZW4gICAgICAgICA9IERPTkVfU0MtPm9sZF9jbWRfbGVuOworCisJCQlET05FX1NDLT5TQ3AuU3RhdHVzID0gMHgwMjsKKworCQkJSE9TVERBVEEoc2hwbnQpLT5jb21tYW5kcy0tOworCQkJaWYgKCFIT1NUREFUQShzaHBudCktPmNvbW1hbmRzKQorCQkJCVNFVFBPUlQoUE9SVEEsIDApOwkvKiB0dXJuIGxlZCBvZmYgKi8KKwkJfSBlbHNlIGlmKERPTkVfU0MtPlNDcC5TdGF0dXM9PTB4MDIpIHsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwkJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRoX2NoZWNrX2NvbmRpdGlvbisrOworI2VuZGlmCisjaWYgMAorCQkJRFBSSU5USyhkZWJ1Z19laCwgRVJSX0xFQUQgIkNIRUNLIENPTkRJVElPTiBmb3VuZFxuIiwgQ01ESU5GTyhET05FX1NDKSk7CisjZW5kaWYKKworCQkJaWYoIShET05FX1NDLT5TQ3AuU3RhdHVzICYgbm90X2lzc3VlZCkpIHsKKwkJCQlTY3NpX0NtbmQgKnB0ciA9IERPTkVfU0M7CisJCQkJRE9ORV9TQz1OVUxMOworI2lmIDAKKwkJCQlEUFJJTlRLKGRlYnVnX2VoLCBFUlJfTEVBRCAicmVxdWVzdGluZyBzZW5zZVxuIiwgQ01ESU5GTyhwdHIpKTsKKyNlbmRpZgorCisJCQkJcHRyLT5jbW5kWzBdICAgICAgICAgPSBSRVFVRVNUX1NFTlNFOworCQkJCXB0ci0+Y21uZFsxXSAgICAgICAgID0gMDsKKwkJCQlwdHItPmNtbmRbMl0gICAgICAgICA9IDA7CisJCQkJcHRyLT5jbW5kWzNdICAgICAgICAgPSAwOworCQkJCXB0ci0+Y21uZFs0XSAgICAgICAgID0gc2l6ZW9mKHB0ci0+c2Vuc2VfYnVmZmVyKTsKKwkJCQlwdHItPmNtbmRbNV0gICAgICAgICA9IDA7CisJCQkJcHRyLT5jbWRfbGVuICAgICAgICAgPSA2OworCQkJCXB0ci0+dXNlX3NnICAgICAgICAgID0gMDsgCisJCQkJcHRyLT5yZXF1ZXN0X2J1ZmZlciAgPSBwdHItPnNlbnNlX2J1ZmZlcjsKKwkJCQlwdHItPnJlcXVlc3RfYnVmZmxlbiA9IHNpemVvZihwdHItPnNlbnNlX2J1ZmZlcik7CisJCQkKKwkJCQlET19VTkxPQ0soZmxhZ3MpOworCQkJCWFoYTE1MnhfaW50ZXJuYWxfcXVldWUocHRyLCBOVUxMLCBjaGVja19jb25kaXRpb24sIHB0ci0+c2NzaV9kb25lKTsKKwkJCQlET19MT0NLKGZsYWdzKTsKKyNpZiAwCisJCQl9IGVsc2UgeworCQkJCURQUklOVEsoZGVidWdfZWgsIEVSUl9MRUFEICJjb21tYW5kIG5vdCBpc3N1ZWQgLSBDSEVDSyBDT05ESVRJT04gaWdub3JlZFxuIiwgQ01ESU5GTyhET05FX1NDKSk7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCWlmKERPTkVfU0MgJiYgRE9ORV9TQy0+c2NzaV9kb25lKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJaW50IGhvc3Rubz1ET05FX1NDLT5kZXZpY2UtPmhvc3QtPmhvc3Rfbm87CisJCQlpbnQgaWQ9RE9ORV9TQy0+ZGV2aWNlLT5pZCAmIDB4ZjsKKwkJCWludCBsdW49RE9ORV9TQy0+ZGV2aWNlLT5sdW4gJiAweDc7CisjZW5kaWYKKwkJCVNjc2lfQ21uZCAqcHRyID0gRE9ORV9TQzsKKwkJCURPTkVfU0M9TlVMTDsKKworCQkJLyogdHVybiBsZWQgb2ZmLCB3aGVuIG5vIGNvbW1hbmRzIGFyZSBpbiB0aGUgZHJpdmVyICovCisJCQlIT1NUREFUQShzaHBudCktPmNvbW1hbmRzLS07CisJCQlpZiAoIUhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMpCisJCQkJU0VUUE9SVChQT1JUQSwgMCk7CS8qIHR1cm4gbGVkIG9mZiAqLworCisJCQlpZihwdHItPnNjc2lfZG9uZSAhPSByZXNldF9kb25lKSB7CisJCQkJa2ZyZWUocHRyLT5ob3N0X3NjcmliYmxlKTsKKwkJCQlwdHItPmhvc3Rfc2NyaWJibGU9TlVMTDsKKwkJCX0KKworCQkJRE9fVU5MT0NLKGZsYWdzKTsKKwkJCURQUklOVEsoZGVidWdfZG9uZSwgREVCVUdfTEVBRCAiY2FsbGluZyBzY3NpX2RvbmUoJXApXG4iLCBob3N0bm8sIGlkLCBsdW4sIHB0cik7CisgICAgICAgICAgICAgICAgCXB0ci0+c2NzaV9kb25lKHB0cik7CisJCQlEUFJJTlRLKGRlYnVnX2RvbmUsIERFQlVHX0xFQUQgInNjc2lfZG9uZSglcCkgcmV0dXJuZWRcbiIsIGhvc3RubywgaWQsIGx1biwgcHRyKTsKKwkJCURPX0xPQ0soZmxhZ3MpOworCQl9CisKKwkJRE9ORV9TQz1OVUxMOworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCX0gZWxzZSB7CisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2RvbmVfY29tbWFuZCsrOworI2VuZGlmCisJfQorCisJaWYoSVNTVUVfU0MpCisJCUNVUlJFTlRfU0MgPSByZW1vdmVfZmlyc3RfU0MoJklTU1VFX1NDKTsKKworCURPX1VOTE9DSyhmbGFncyk7CisKKwlpZihDVVJSRU5UX1NDKSB7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCWFjdGlvbisrOworI2VuZGlmCisJICAgIAlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gc2VsZWN0aW5nOworCisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJzZWxlY3RpbmcgdGFyZ2V0XG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKworCQkvKiBjbGVhciBzZWxlY3Rpb24gdGltZW91dCAqLworCQlTRVRQT1JUKFNTVEFUMSwgU0VMVE8pOworCisJCVNFVFBPUlQoU0NTSUlELCAoc2hwbnQtPnRoaXNfaWQgPDwgT0lEXykgfCBDVVJSRU5UX1NDLT5kZXZpY2UtPmlkKTsKKwkJU0VUUE9SVChTWEZSQ1RMMSwgKFBBUklUWSA/IEVOU1BDSEsgOiAwICkgfCBFTlNUSU1FUik7CisJCVNFVFBPUlQoU0NTSVNFUSwgRU5TRUxPIHwgRU5BVVRPQVROTyB8IChESVNDT05ORUNURURfU0MgPyBFTlJFU0VMSSA6IDApKTsKKwl9IGVsc2UgeworI2lmIGRlZmluZWQoQUhBMTUyWF9TVEFUKQorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9uZXdfY29tbWFuZCsrOworI2VuZGlmCisJCVNFVFBPUlQoU0NTSVNFUSwgRElTQ09OTkVDVEVEX1NDID8gRU5SRVNFTEkgOiAwKTsKKwl9CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfU1RBVCkKKwlpZighYWN0aW9uKQorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9hbnlfYWN0aW9uKys7CisjZW5kaWYKK30KKworLyoKKyAqIFNlbGVjdGlvbiBkb25lIChPVVQpCisgKiAtIHF1ZXVlIElERU5USUZZIG1lc3NhZ2UgYW5kIFNEVFIgdG8gc2VsZWN0ZWQgdGFyZ2V0IGZvciBtZXNzYWdlIG91dAorICogICAoQVROIGFzc2VydGVkIGF1dG9tYWdpY2FsbHkgdmlhIEVOQVVUT0FUTk8gaW4gYnVzZnJlZSgpKQorICovCitzdGF0aWMgdm9pZCBzZWxkb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJU0VUUE9SVChTQ1NJU0lHLCAwKTsKKwlTRVRQT1JUKFNTVEFUMSwgQ0xSQlVTRlJFRSk7CisJU0VUUE9SVChTU1RBVDEsIENMUlBIQVNFQ0hHKTsKKworICAgIAlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfihzZWxlY3Rpbmd8bm90X2lzc3VlZCk7CisKKwlTRVRQT1JUKFNDU0lTRVEsIDApOworCisJaWYgKFRFU1RMTyhTU1RBVDAsIFNFTERPKSkgeworCQlwcmludGsoRVJSX0xFQUQgImFoYTE1Mng6IHBhc3NpbmcgYnVzIGZyZWUgY29uZGl0aW9uXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZG9uZShzaHBudCwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCQlyZXR1cm47CisJfQorCisJU0VUUE9SVChTU1RBVDAsIENMUlNFTERPKTsKKwkKKwlBRERNU0dPKElERU5USUZZKFJFQ09OTkVDVCwgQ1VSUkVOVF9TQy0+ZGV2aWNlLT5sdW4pKTsKKworCWlmIChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBhYm9ydGluZykgeworCQlBRERNU0dPKEFCT1JUKTsKKwl9IGVsc2UgaWYgKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHJlc2V0dGluZykgeworCQlBRERNU0dPKEJVU19ERVZJQ0VfUkVTRVQpOworCX0gZWxzZSBpZiAoU1lOQ05FRz09MCAmJiBTWU5DSFJPTk9VUykgeworICAgIAkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHN5bmNuZWc7CisJCUFERE1TR08oRVhURU5ERURfTUVTU0FHRSk7CisJCUFERE1TR08oMyk7CisJCUFERE1TR08oRVhURU5ERURfU0RUUik7CisJCUFERE1TR08oNTApOwkJLyogMjAwbnMgKi8KKwkJQURETVNHTyg4KTsJCS8qIDggYnl0ZSByZXEvYWNrIG9mZnNldCAqLworCisJCVNZTkNORUc9MTsJCS8qIG5lZ290aWF0aW9uIGluIHByb2dyZXNzICovCisJfQorCisJU0VUUkFURShTWU5DUkFURSk7Cit9CisKKy8qCisgKiBTZWxlY3Rpb24gdGltZW91dAorICogLSByZXR1cm4gY29tbWFuZCB0byBtaWQtbGV2ZWwgd2l0aCBmYWlsdXJlIGNhdXNlCisgKgorICovCitzdGF0aWMgdm9pZCBzZWx0b19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJU0VUUE9SVChTQ1NJU0VRLCAwKTsJCQorCVNFVFBPUlQoU1NUQVQxLCBDTFJTRUxUSU1PKTsKKworCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJzZWxlY3Rpb24gdGltZW91dFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwlpZighQ1VSUkVOVF9TQykgeworCQlEUFJJTlRLKGRlYnVnX3NlbGVjdGlvbiwgREVCVUdfTEVBRCAiIUNVUlJFTlRfU0NcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlyZXR1cm47CisJfQorCisgICAgCUNVUlJFTlRfU0MtPlNDcC5waGFzZSAmPSB+c2VsZWN0aW5nOworCisJaWYgKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIGFib3J0ZWQpIHsKKwkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgImFib3J0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlkb25lKHNocG50LCBESURfQUJPUlQgPDwgMTYpOworCX0gZWxzZSBpZiAoVEVTVExPKFNTVEFUMCwgU0VMSU5HTykpIHsKKwkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgImFyYml0cmF0aW9uIG5vdCB3b25cbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlkb25lKHNocG50LCBESURfQlVTX0JVU1kgPDwgMTYpOworCX0gZWxzZSB7CisJCS8qIEFSQklUUkFUSU9OIHdvbiwgYnV0IFNFTEVDVElPTiBmYWlsZWQgKi8KKwkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIERFQlVHX0xFQUQgInNlbGVjdGlvbiBmYWlsZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlkb25lKHNocG50LCBESURfTk9fQ09OTkVDVCA8PCAxNik7CisJfQorfQorCisvKgorICogU2VsZWN0aW9uIGluIGRvbmUKKyAqIC0gcHV0IGN1cnJlbnQgY29tbWFuZCBiYWNrIHRvIGlzc3VlIHF1ZXVlCisgKiAgIChyZWNvbm5lY3Rpb24gb2YgYSBkaXNjb25uZWN0ZWQgbmV4dXMgaW5zdGVhZAorICogICAgb2Ygc3VjY2Vzc2Z1bCBzZWxlY3Rpb24gb3V0KQorICoKKyAqLworc3RhdGljIHZvaWQgc2VsZGlfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWludCBzZWxpZDsKKwlpbnQgdGFyZ2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlTRVRQT1JUKFNDU0lTSUcsIDApOworCVNFVFBPUlQoU1NUQVQwLCBDTFJTRUxESSk7CisJU0VUUE9SVChTU1RBVDEsIENMUkJVU0ZSRUUpOworCVNFVFBPUlQoU1NUQVQxLCBDTFJQSEFTRUNIRyk7CisKKwlpZihDVVJSRU5UX1NDKSB7CisJCWlmKCEoQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICYgbm90X2lzc3VlZCkpCisJCQlwcmludGsoRVJSX0xFQUQgImNvbW1hbmQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gaXNzdWVkIHlldFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwkJRFBSSU5USyhkZWJ1Z19zZWxlY3Rpb24sIEVSUl9MRUFEICJjb21tYW5kIHJlcXVldWVkIC0gcmVzZWxlY3Rpb25cbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJCURPX0xPQ0soZmxhZ3MpOworCQlhcHBlbmRfU0MoJklTU1VFX1NDLCBDVVJSRU5UX1NDKTsKKwkJRE9fVU5MT0NLKGZsYWdzKTsKKworCQlDVVJSRU5UX1NDID0gTlVMTDsKKwl9CisKKwlpZighRElTQ09OTkVDVEVEX1NDKSB7CisJCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJ1bmV4cGVjdGVkIFNFTERJICIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlyZXR1cm47CisJfQorCisJUkVDT05OX1RBUkdFVD0tMTsKKworCXNlbGlkID0gR0VUUE9SVChTRUxJRCkgJiB+KDEgPDwgc2hwbnQtPnRoaXNfaWQpOworCisJaWYgKHNlbGlkPT0wKSB7CisJCXByaW50aygiYWhhMTUyeCVkOiB0YXJnZXQgaWQgdW5rbm93biAoJTAyeClcbiIsIEhPU1ROTywgc2VsaWQpOworCQlyZXR1cm47CisJfQorCisJZm9yKHRhcmdldD03OyAhKHNlbGlkICYgKDEgPDwgdGFyZ2V0KSk7IHRhcmdldC0tKQorCQk7CisKKwlpZihzZWxpZCAmIH4oMSA8PCB0YXJnZXQpKSB7CisJCXByaW50aygiYWhhMTUyeCVkOiBtdWx0aXBsZSB0YXJnZXRzIHJlY29ubmVjdGVkICglMDJ4KVxuIiwKKwkJICAgICAgIEhPU1ROTywgc2VsaWQpOworCX0KKworCisJU0VUUE9SVChTQ1NJSUQsIChzaHBudC0+dGhpc19pZCA8PCBPSURfKSB8IHRhcmdldCk7CisJU0VUUE9SVChTQ1NJU0VRLCAwKTsKKworCVNFVFJBVEUoSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVt0YXJnZXRdKTsKKworCVJFQ09OTl9UQVJHRVQ9dGFyZ2V0OworCURQUklOVEsoZGVidWdfc2VsZWN0aW9uLCBERUJVR19MRUFEICJ0YXJnZXQgJWQgcmVzZWxlY3RlZCAoJTAyeCkuXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCB0YXJnZXQsIHNlbGlkKTsKK30KKworLyoKKyAqIG1lc3NhZ2UgaW4gcGhhc2UKKyAqIC0gaGFuZGxlIGluaXRpYWwgbWVzc2FnZSBhZnRlciByZWNvbm5lY3Rpb24gdG8gaWRlbnRpZnkKKyAqICAgcmVjb25uZWN0aW5nIG5leHVzCisgKiAtIHF1ZXVlIGNvbW1hbmQgb24gRElTQ09OTkVDVEVEX1NDIG9uIERJU0NPTk5FQ1QgbWVzc2FnZQorICogLSBzZXQgY29tcGxldGVkIGZsYWcgb24gQ09NTUFORCBDT01QTEVURQorICogICAob3RoZXIgY29tcGxldGl0aW9uIGNvZGUgbW92ZWQgdG8gYnVzZnJlZV9ydW4pCisgKiAtIGhhbmRsZSByZXNwb25zZSB0byBTRFRSCisgKiAtIGNsZWFyIHN5bmNocm9ub3VzIHRyYW5zZmVyIGFncmVlbWVudHMgb24gQlVTIFJFU0VUCisgKgorICogRklYTUU6IHdoYXQgYWJvdXQgU0FWRSBQT0lOVEVSUywgUkVTVE9SRSBQT0lOVEVSUz8KKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1zZ2lfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWZvcig7OykgeworCQlpbnQgc3N0YXQxID0gR0VUUE9SVChTU1RBVDEpOworCisJCWlmKHNzdGF0MSAmIChQSEFTRUNIR3xQSEFTRU1JU3xCVVNGUkVFKSB8fCAhKHNzdGF0MSAmIFJFUUlOSVQpKQorCQkJcmV0dXJuOworCisJCWlmKFRFU1RMTyhTU1RBVDAsU1BJT1JEWSkpIHsKKwkJCURQUklOVEsoZGVidWdfbXNnaSwgREVCVUdfTEVBRCAiIVNQSU9SRFlcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJcmV0dXJuOworCQl9CQorCisJCUFERE1TR0koR0VUUE9SVChTQ1NJREFUKSk7CisKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJCWlmIChIT1NUREFUQShzaHBudCktPmRlYnVnICYgZGVidWdfbXNnaSkgeworCQkJcHJpbnRrKElORk9fTEVBRCAiaW5ib3VuZCBtZXNzYWdlICUwMnggIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHSSgwKSk7CisJCQlwcmludF9tc2coJk1TR0koMCkpOworCQkJcHJpbnRrKCJcbiIpOworCQl9CisjZW5kaWYKKworCQlpZighQ1VSUkVOVF9TQykgeworCQkJaWYoTEFTVFNUQVRFIT1zZWxkaSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBtZXNzYWdlIGluIHcvbyBjdXJyZW50IGNvbW1hbmQgbm90IGFmdGVyIHJlc2VsZWN0aW9uXG4iLCBIT1NUTk8pOworCQkJfQorCisJCQkvKgorCSAJIAkgKiBIYW5kbGUgcmVzZWxlY3Rpb24KKwkgCQkgKi8KKwkJCWlmKCEoTVNHSSgwKSAmIElERU5USUZZX0JBU0UpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4JWQ6IHRhcmdldCBkaWRuJ3QgaWRlbnRpZnkgYWZ0ZXIgcmVzZWxlY3Rpb25cbiIsIEhPU1ROTyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCUNVUlJFTlRfU0MgPSByZW1vdmVfbHVuX1NDKCZESVNDT05ORUNURURfU0MsIFJFQ09OTl9UQVJHRVQsIE1TR0koMCkgJiAweDNmKTsKKworCQkJaWYgKCFDVVJSRU5UX1NDKSB7CisJCQkJc2hvd19xdWV1ZXMoc2hwbnQpOworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeCVkOiBubyBkaXNjb25uZWN0ZWQgY29tbWFuZCBmb3IgdGFyZ2V0ICVkLyVkXG4iLCBIT1NUTk8sIFJFQ09OTl9UQVJHRVQsIE1TR0koMCkgJiAweDNmKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJRFBSSU5USyhkZWJ1Z19tc2dpLCBERUJVR19MRUFEICJ0YXJnZXQgcmVjb25uZWN0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCisJCQlDVVJSRU5UX1NDLT5TQ3AuTWVzc2FnZSA9IE1TR0koMCk7CisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJj0gfmRpc2Nvbm5lY3RlZDsKKworCQkJTVNHSUxFTj0wOworCisJCQkvKiBuZXh0IG1lc3NhZ2UgaWYgYW55ICovCisJCQljb250aW51ZTsKKwkJfSAKKworCQlDVVJSRU5UX1NDLT5TQ3AuTWVzc2FnZSA9IE1TR0koMCk7CisKKwkJc3dpdGNoIChNU0dJKDApKSB7CisJCWNhc2UgRElTQ09OTkVDVDoKKwkJCWlmICghUkVDT05ORUNUKQorCQkJCXByaW50ayhXQVJOX0xFQUQgInRhcmdldCB3YXMgbm90IGFsbG93ZWQgdG8gZGlzY29ubmVjdFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisKKwkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBkaXNjb25uZWN0ZWQ7CisJCQlicmVhazsKKworCQljYXNlIENPTU1BTkRfQ09NUExFVEU6CisJCQlpZihDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBjb21wbGV0ZWQpCisJCQkJRFBSSU5USyhkZWJ1Z19tc2dpLCBERUJVR19MRUFEICJhZ2FpbiBDT01NQU5EIENPTVBMRVRFXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKworCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IGNvbXBsZXRlZDsKKwkJCWJyZWFrOworCisJCWNhc2UgTUVTU0FHRV9SRUpFQ1Q6CisJCQlpZiAoU1lOQ05FRz09MSkgeworCQkJCXByaW50ayhJTkZPX0xFQUQgIlN5bmNocm9ub3VzIERhdGEgVHJhbnNmZXIgUmVxdWVzdCB3YXMgcmVqZWN0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJCVNZTkNORUc9MjsJLyogbmVnb3RpYXRpb24gY29tcGxldGVkICovCisJCQl9IGVsc2UKKwkJCQlwcmludGsoSU5GT19MRUFEICJpbmJvdW5kIG1lc3NhZ2UgKE1FU1NBR0UgUkVKRUNUKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlicmVhazsKKworCQljYXNlIFNBVkVfUE9JTlRFUlM6CisJCQlicmVhazsKKworCQljYXNlIFJFU1RPUkVfUE9JTlRFUlM6CisJCQlicmVhazsKKworCQljYXNlIEVYVEVOREVEX01FU1NBR0U6CisJCQlpZihNU0dJTEVOPDIgfHwgTVNHSUxFTjxNU0dJKDEpKzIpIHsKKwkJCQkvKiBub3QgeWV0IGNvbXBsZXRlZCAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzd2l0Y2ggKE1TR0koMikpIHsKKwkJCWNhc2UgRVhURU5ERURfU0RUUjoKKwkJCQl7CisJCQkJCWxvbmcgdGlja3M7CisKKwkJCQkJaWYgKE1TR0koMSkgIT0gMykgeworCQkJCQkJcHJpbnRrKEVSUl9MRUFEICJTRFRSIG1lc3NhZ2UgbGVuZ3RoIT0zXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKCFIT1NUREFUQShzaHBudCktPnN5bmNocm9ub3VzKQorCQkJCQkJYnJlYWs7CisKKwkJCQkJcHJpbnRrKElORk9fTEVBRCwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQkJCXByaW50X21zZygmTVNHSSgwKSk7CisJCQkJCXByaW50aygiXG4iKTsKKworCQkJCQl0aWNrcyA9IChNU0dJKDMpICogNCArIDQ5KSAvIDUwOworCisJCQkJCWlmIChzeW5jbmVnKSB7CisJCQkJCQkvKiBuZWdvdGlhdGlvbiBpbiBwcm9ncmVzcyAqLworCQkJCQkJaWYgKHRpY2tzID4gOSB8fCBNU0dJKDQpIDwgMSB8fCBNU0dJKDQpID4gOCkgeworCQkJCQkJCUFERE1TR08oTUVTU0FHRV9SRUpFQ1QpOworCQkJCQkJCXByaW50ayhJTkZPX0xFQUQgInJlY2VpdmVkIFN5bmNocm9ub3VzIERhdGEgVHJhbnNmZXIgUmVxdWVzdCBpbnZhbGlkIC0gcmVqZWN0ZWRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlTWU5DUkFURSB8PSAoKHRpY2tzIC0gMikgPDwgNCkgKyBNU0dJKDQpOworCQkJCQl9IGVsc2UgaWYgKHRpY2tzIDw9IDkgJiYgTVNHSSg0KSA+PSAxKSB7CisJCQkJCQlBRERNU0dPKEVYVEVOREVEX01FU1NBR0UpOworCQkJCQkJQURETVNHTygzKTsKKwkJCQkJCUFERE1TR08oRVhURU5ERURfU0RUUik7CisJCQkJCQlpZiAodGlja3MgPCA0KSB7CisJCQkJCQkJdGlja3MgPSA0OworCQkJCQkJCUFERE1TR08oNTApOworCQkJCQkJfSBlbHNlCisJCQkJCQkJQURETVNHTyhNU0dJKDMpKTsKKworCQkJCQkJaWYgKE1TR0koNCkgPiA4KQorCQkJCQkJCU1TR0koNCkgPSA4OworCisJCQkJCQlBRERNU0dPKE1TR0koNCkpOworCisJCQkJCQlTWU5DUkFURSB8PSAoKHRpY2tzIC0gMikgPDwgNCkgKyBNU0dJKDQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogcmVxdWVzdGVkIFNEVFIgaXMgdG9vIHNsb3csIGRvIGl0IGFzeW5jaHJvbm91c2x5ICovCisJCQkJCQlwcmludGsoSU5GT19MRUFEICJTeW5jaHJvbm91cyBEYXRhIFRyYW5zZmVyIFJlcXVlc3QgdG9vIHNsb3cgLSBSZWplY3RpbmdcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CisJCQkJCX0KKworCQkJCQlTWU5DTkVHPTI7CQkvKiBuZWdvdGlhdGlvbiBjb21wbGV0ZWQgKi8KKwkJCQkJU0VUUkFURShTWU5DUkFURSk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEJVU19ERVZJQ0VfUkVTRVQ6CisJCQkJeworCQkJCQlpbnQgaTsKKworCQkJCQlmb3IoaT0wOyBpPDg7IGkrKykgeworCQkJCQkJSE9TVERBVEEoc2hwbnQpLT5zeW5jcmF0ZVtpXT0wOworCQkJCQkJSE9TVERBVEEoc2hwbnQpLT5zeW5jbmVnW2ldPTA7CisJCQkJCX0KKworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBFWFRFTkRFRF9NT0RJRllfREFUQV9QT0lOVEVSOgorCQkJY2FzZSBFWFRFTkRFRF9FWFRFTkRFRF9JREVOVElGWToKKwkJCWNhc2UgRVhURU5ERURfV0RUUjoKKwkJCWRlZmF1bHQ6CisJCQkJQURETVNHTyhNRVNTQUdFX1JFSkVDVCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCU1TR0lMRU49MDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zZ2lfZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKE1TR0lMRU4+MCkKKwkJcHJpbnRrKFdBUk5fTEVBRCAidGFyZ2V0IGxlZnQgYmVmb3JlIG1lc3NhZ2UgY29tcGxldGVkICglZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIE1TR0lMRU4pOworCisJaWYgKE1TR09MRU4gPiAwICYmICEoR0VUUE9SVChTU1RBVDEpICYgQlVTRlJFRSkpIHsKKwkJRFBSSU5USyhkZWJ1Z19tc2dpLCBERUJVR19MRUFEICJtc2dvIHBlbmRpbmdcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlTRVRQT1JUKFNDU0lTSUcsIFBfTVNHSSB8IFNJR19BVE5PKTsKKwl9IAorfQorCisvKgorICogbWVzc2FnZSBvdXQgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG1zZ29faW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihNU0dPTEVOPT0wKSB7CisJCWlmKChDVVJSRU5UX1NDLT5TQ3AucGhhc2UgJiBzeW5jbmVnKSAmJiBTWU5DTkVHPT0yICYmIFNZTkNSQVRFPT0wKSB7CisJCQlBRERNU0dPKElERU5USUZZKFJFQ09OTkVDVCwgQ1VSUkVOVF9TQy0+ZGV2aWNlLT5sdW4pKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhJTkZPX0xFQUQgInVuZXhwZWN0ZWQgTUVTU0FHRSBPVVQgcGhhc2U7IHJlamVjdGluZ1xuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlBRERNU0dPKE1FU1NBR0VfUkVKRUNUKTsKKwkJfQorCX0KKworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpZihIT1NUREFUQShzaHBudCktPmRlYnVnICYgZGVidWdfbXNnbykgeworCQlpbnQgaTsKKworCQlwcmludGsoREVCVUdfTEVBRCAibWVzc2FnZXMoICIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlmb3IgKGk9MDsgaTxNU0dPTEVOOyBpKz1wcmludF9tc2coJk1TR08oaSkpLCBwcmludGsoIiAiKSkKKwkJCTsKKwkJcHJpbnRrKCIpXG4iKTsKKwl9CisjZW5kaWYKK30KKworLyoKKyAqIG1lc3NhZ2Ugb3V0IHBoYXNlCisgKgorICovCitzdGF0aWMgdm9pZCBtc2dvX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihNU0dPX0k9PU1TR09MRU4pCisJCURQUklOVEsoZGVidWdfbXNnbywgREVCVUdfTEVBRCAibWVzc2FnZXMgYWxsIHNlbnQgKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHT19JLCBNU0dPTEVOKTsKKworCXdoaWxlKE1TR09fSTxNU0dPTEVOKSB7CisJCURQUklOVEsoZGVidWdfbXNnbywgREVCVUdfTEVBRCAibWVzc2FnZSBieXRlICUwMnggKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHTyhNU0dPX0kpLCBNU0dPX0ksIE1TR09MRU4pOworCisJCWlmKFRFU1RMTyhTU1RBVDAsIFNQSU9SRFkpKSB7CisJCQlEUFJJTlRLKGRlYnVnX21zZ28sIERFQlVHX0xFQUQgIiFTUElPUkRZXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChNU0dPX0k9PU1TR09MRU4tMSkgeworCQkJLyogTGVhdmUgTUVTU0FHRSBPVVQgYWZ0ZXIgdHJhbnNmZXIgKi8KKwkJCVNFVFBPUlQoU1NUQVQxLCBDTFJBVE5PKTsKKwkJfQorCisKKwkJaWYgKE1TR08oTVNHT19JKSAmIElERU5USUZZX0JBU0UpCisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gaWRlbnRpZmllZDsKKworCQlpZiAoTVNHTyhNU0dPX0kpPT1BQk9SVCkKKwkJCUNVUlJFTlRfU0MtPlNDcC5waGFzZSB8PSBhYm9ydGVkOworCisJCWlmIChNU0dPKE1TR09fSSk9PUJVU19ERVZJQ0VfUkVTRVQpCisJCQlDVVJSRU5UX1NDLT5TQ3AucGhhc2UgfD0gcmVzZXR0ZWQ7CisKKwkJU0VUUE9SVChTQ1NJREFULCBNU0dPKE1TR09fSSsrKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtc2dvX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihNU0dPX0k8TVNHT0xFTikgeworCQlwcmludGsoRVJSX0xFQUQgIm1lc3NhZ2Ugc2VudCBpbmNvbXBsZXRlbHkgKCVkLyVkKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgTVNHT19JLCBNU0dPTEVOKTsKKwkJaWYoU1lOQ05FRz09MSkgeworCQkJcHJpbnRrKElORk9fTEVBRCAiU3luY2hyb25vdXMgRGF0YSBUcmFuc2ZlciBSZXF1ZXN0IHdhcyByZWplY3RlZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCQlTWU5DTkVHPTI7CisJCX0KKwl9CisJCQorCU1TR09fSSAgPSAwOworCU1TR09MRU4gPSAwOworfQorCisvKiAKKyAqIGNvbW1hbmQgcGhhc2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNtZF9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmIChDVVJSRU5UX1NDLT5TQ3Auc2VudF9jb21tYW5kKSB7CisJCXByaW50ayhFUlJfTEVBRCAiY29tbWFuZCBhbHJlYWR5IHNlbnRcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQlkb25lKHNocG50LCBESURfRVJST1IgPDwgMTYpOworCQlyZXR1cm47CisJfQorCisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCWlmIChIT1NUREFUQShzaHBudCktPmRlYnVnICYgZGVidWdfY21kKSB7CisJCXByaW50ayhERUJVR19MRUFEICJjbWRfaW5pdDogIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCXByaW50X2NvbW1hbmQoQ1VSUkVOVF9TQy0+Y21uZCk7CisJfQorI2VuZGlmCisKKwlDTURfST0wOworfQorCisvKgorICogY29tbWFuZCBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgY21kX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihDTURfST09Q1VSUkVOVF9TQy0+Y21kX2xlbikgeworCQlEUFJJTlRLKGRlYnVnX2NtZCwgREVCVUdfTEVBRCAiY29tbWFuZCBhbHJlYWR5IGNvbXBsZXRlbHkgc2VudCAoJWQvJWQpIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgQ01EX0ksIENVUlJFTlRfU0MtPmNtZF9sZW4pOworCQlkaXNwX3BvcnRzKHNocG50KTsKKwl9CisKKwl3aGlsZShDTURfSTxDVVJSRU5UX1NDLT5jbWRfbGVuKSB7CisJCURQUklOVEsoZGVidWdfY21kLCBERUJVR19MRUFEICJjb21tYW5kIGJ5dGUgJTAyeCAoJWQvJWQpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5jbW5kW0NNRF9JXSwgQ01EX0ksIENVUlJFTlRfU0MtPmNtZF9sZW4pOworCisJCWlmKFRFU1RMTyhTU1RBVDAsIFNQSU9SRFkpKSB7CisJCQlEUFJJTlRLKGRlYnVnX2NtZCwgREVCVUdfTEVBRCAiIVNQSU9SRFlcbiIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJcmV0dXJuOworCQl9CisKKwkJU0VUUE9SVChTQ1NJREFULCBDVVJSRU5UX1NDLT5jbW5kW0NNRF9JKytdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNtZF9lbmQoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoQ01EX0k8Q1VSUkVOVF9TQy0+Y21kX2xlbikKKwkJcHJpbnRrKEVSUl9MRUFEICJjb21tYW5kIHNlbnQgaW5jb21wbGV0ZWx5ICglZC8lZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIENNRF9JLCBDVVJSRU5UX1NDLT5jbWRfbGVuKTsKKwllbHNlCisJCUNVUlJFTlRfU0MtPlNDcC5zZW50X2NvbW1hbmQrKzsKK30KKworLyoKKyAqIHN0YXR1cyBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgc3RhdHVzX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpZihURVNUTE8oU1NUQVQwLFNQSU9SRFkpKSB7CisJCURQUklOVEsoZGVidWdfc3RhdHVzLCBERUJVR19MRUFEICIhU1BJT1JEWVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCXJldHVybjsKKwl9CisKKwlDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzID0gR0VUUE9SVChTQ1NJREFUKTsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpZiAoSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyAmIGRlYnVnX3N0YXR1cykgeworCQlwcmludGsoREVCVUdfTEVBRCAiaW5ib3VuZCBzdGF0dXMgJTAyeCAiLCBDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5TQ3AuU3RhdHVzKTsKKwkJcHJpbnRfc3RhdHVzKENVUlJFTlRfU0MtPlNDcC5TdGF0dXMpOworCQlwcmludGsoIlxuIik7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBkYXRhIGluIHBoYXNlCisgKgorICovCitzdGF0aWMgdm9pZCBkYXRhaV9pbml0KHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNFVFBPUlQoRE1BQ05UUkwwLCBSU1RGSUZPKTsKKwlTRVRQT1JUKERNQUNOVFJMMCwgUlNURklGT3xFTkRNQSk7CisKKwlTRVRQT1JUKFNYRlJDVEwwLCBDSDF8Q0xSU1RDTlQpOworCVNFVFBPUlQoU1hGUkNUTDAsIENIMXxTQ1NJRU58RE1BRU4pOworCisJU0VUUE9SVChTSU1PREUwLCAwKTsKKwlTRVRQT1JUKFNJTU9ERTEsIEVOU0NTSVBFUlIgfCBFTlNDU0lSU1QgfCBFTlBIQVNFTUlTIHwgRU5CVVNGUkVFKTsKKworCURBVEFfTEVOPTA7CisJRFBSSU5USyhkZWJ1Z19kYXRhaSwKKwkJREVCVUdfTEVBRCAiZGF0YWlfaW5pdDogcmVxdWVzdF9idWZmbGVuPSVkIHJlc2lkPSVkXG4iLAorCQlDTURJTkZPKENVUlJFTlRfU0MpLCBDVVJSRU5UX1NDLT5yZXF1ZXN0X2J1ZmZsZW4sIENVUlJFTlRfU0MtPnJlc2lkKTsKK30KKworc3RhdGljIHZvaWQgZGF0YWlfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCXVuc2lnbmVkIGxvbmcgdGhlX3RpbWU7CisJaW50IGZpZm9kYXRhLCBkYXRhX2NvdW50OworCisJLyoKKwkgKiBsb29wIHdoaWxlIHRoZSBwaGFzZSBwZXJzaXN0cyBvciB0aGUgZmlmb3MgYXJlIG5vdCBlbXB0eQorCSAqCisJICovCisJd2hpbGUoVEVTVExPKERNQVNUQVQsIElOVFNUQVQpIHx8IFRFU1RMTyhETUFTVEFULCBERklGT0VNUCkgfHwgVEVTVExPKFNTVEFUMiwgU0VNUFRZKSkgeworCQkvKiBGSVhNRTogbWF5YmUgdGhpcyBzaG91bGQgYmUgZG9uZSBieSBzZXR0aW5nIHVwCisJCSAqIFNUQ05UIHRvIHRyaWdnZXIgRU5TV1JBUCBpbnRlcnJ1cHQsIGluc3RlYWQgb2YKKwkJICogcG9sbGluZyBmb3IgREZJRk9GVUxMCisJCSAqLworCQl0aGVfdGltZT1qaWZmaWVzICsgMTAwKkhaOworCQl3aGlsZShURVNUTE8oRE1BU1RBVCwgREZJRk9GVUxMfElOVFNUQVQpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsdGhlX3RpbWUpKQorCQkJYmFycmllcigpOworCisJCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0ZVTEx8SU5UU1RBVCkpIHsKKwkJCXByaW50ayhFUlJfTEVBRCAiZGF0YWkgdGltZW91dCIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJZGlzcF9wb3J0cyhzaHBudCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmKFRFU1RISShETUFTVEFULCBERklGT0ZVTEwpKSB7CisJCQlmaWZvZGF0YSA9IDEyODsKKwkJfSBlbHNlIHsKKwkJCXRoZV90aW1lPWppZmZpZXMgKyAxMDAqSFo7CisJCQl3aGlsZShURVNUTE8oU1NUQVQyLCBTRU1QVFkpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsdGhlX3RpbWUpKQorCQkJCWJhcnJpZXIoKTsKKworCQkJaWYoVEVTVExPKFNTVEFUMiwgU0VNUFRZKSkgeworCQkJCXByaW50ayhFUlJfTEVBRCAiZGF0YWkgc2VtcHR5IHRpbWVvdXQiLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJCQlkaXNwX3BvcnRzKHNocG50KTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZmlmb2RhdGEgPSBHRVRQT1JUKEZJRk9TVEFUKTsKKwkJfQorCisJCWlmKENVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsPjApIHsKKwkJCXdoaWxlKGZpZm9kYXRhPjAgJiYgQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgCWRhdGFfY291bnQgPSBmaWZvZGF0YT5DVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCA/CisJCQkJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCA6CisJCQkJCQlmaWZvZGF0YTsKKwkJCQlmaWZvZGF0YSAtPSBkYXRhX2NvdW50OworCisgICAgICAgICAgICAgICAgICAgICAgICAJaWYoZGF0YV9jb3VudCAmIDEpIHsKKwkJCQkJRFBSSU5USyhkZWJ1Z19kYXRhaSwgREVCVUdfTEVBRCAiOGJpdFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUF8XzhCSVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJKkNVUlJFTlRfU0MtPlNDcC5wdHIrKyA9IEdFVFBPUlQoREFUQVBPUlQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCURBVEFfTEVOKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlTRVRQT1JUKERNQUNOVFJMMCwgRU5ETUEpOworICAgICAgICAgICAgICAgICAgICAgICAgCX0KKwkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlpZihkYXRhX2NvdW50ID4gMSkgeworCQkJCQlEUFJJTlRLKGRlYnVnX2RhdGFpLCBERUJVR19MRUFEICIxNmJpdCglZClcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIGRhdGFfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGF0YV9jb3VudCA+Pj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWluc3coREFUQVBPUlQsIENVUlJFTlRfU0MtPlNDcC5wdHIsIGRhdGFfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgKz0gMiAqIGRhdGFfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCAtPSAyICogZGF0YV9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCURBVEFfTEVOICAgICAgICAgICAgICAgICAgICAgICs9IDIgKiBkYXRhX2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgCX0KKwkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlpZihDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD09MCAmJiBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbD4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkvKiBhZHZhbmNlIHRvIG5leHQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgPSBTR19BRERSRVNTKENVUlJFTlRfU0MtPlNDcC5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPSBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCQkJfSAKKyAgICAgICAgICAgICAgICAJfQorCQl9IGVsc2UgaWYoZmlmb2RhdGE+MCkgeyAKKwkJCXByaW50ayhFUlJfTEVBRCAibm8gYnVmZmVycyBsZWZ0IGZvciAlZCglZCkgYnl0ZXMgKGRhdGEgb3ZlcnJ1biE/KVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgZmlmb2RhdGEsIEdFVFBPUlQoRklGT1NUQVQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVFBPUlQoRE1BQ05UUkwwLCBFTkRNQXxfOEJJVCk7CisJCQl3aGlsZShmaWZvZGF0YT4wKSB7CisJCQkJaW50IGRhdGE7CisJCQkJZGF0YT1HRVRQT1JUKERBVEFQT1JUKTsKKwkJCQlEUFJJTlRLKGRlYnVnX2RhdGFpLCBERUJVR19MRUFEICJkYXRhPSUwMnhcbiIsIENNRElORk8oQ1VSUkVOVF9TQyksIGRhdGEpOworCQkJCWZpZm9kYXRhLS07CisJCQkJREFUQV9MRU4rKzsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVFBPUlQoRE1BQ05UUkwwLCBFTkRNQXxfOEJJVCk7CisJCX0KKwl9CisKKwlpZihURVNUTE8oRE1BU1RBVCwgSU5UU1RBVCkgfHwKKwkgICBURVNUTE8oRE1BU1RBVCwgREZJRk9FTVApIHx8CisJICAgVEVTVExPKFNTVEFUMiwgU0VNUFRZKSB8fAorCSAgIEdFVFBPUlQoRklGT1NUQVQpPjApIHsKKwkgICAJLyoKKwkJICogc29tZXRoaW5nIHdlbnQgd3JvbmcsIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGxlZnQgaW4gdGhlIGZpZm9zCisJCSAqIG9yIHRoZSBwaGFzZSBkaWRuJ3QgY2hhbmdlCisJCSAqLworCQlwcmludGsoRVJSX0xFQUQgImZpZm9zIHNob3VsZCBiZSBlbXB0eSBhbmQgcGhhc2Ugc2hvdWxkIGhhdmUgY2hhbmdlZFxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJCWRpc3BfcG9ydHMoc2hwbnQpOworCX0KKworCWlmKERBVEFfTEVOIT1HRVRTVENOVCgpKSB7CisJCXByaW50ayhFUlJfTEVBRAorCQkgICAgICAgIm1hbnVhbCB0cmFuc2ZlciBjb3VudCBkaWZmZXJzIGZyb20gYXV0b21hdGljIChjb3VudD0lZDtzdGNudD0lZDtkaWZmPSVkO2ZpZm9zdGF0PSVkKSIsCisJCSAgICAgICBDTURJTkZPKENVUlJFTlRfU0MpLCBEQVRBX0xFTiwgR0VUU1RDTlQoKSwgR0VUU1RDTlQoKS1EQVRBX0xFTiwgR0VUUE9SVChGSUZPU1RBVCkpOworCQlkaXNwX3BvcnRzKHNocG50KTsKKwkJbWRlbGF5KDEwMDAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRhdGFpX2VuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlDVVJSRU5UX1NDLT5yZXNpZCAtPSBHRVRTVENOVCgpOworCisJRFBSSU5USyhkZWJ1Z19kYXRhaSwKKwkJREVCVUdfTEVBRCAiZGF0YWlfZW5kOiByZXF1ZXN0X2J1ZmZsZW49JWQgcmVzaWQ9JWQgc3RjbnQ9JWRcbiIsCisJCUNNRElORk8oQ1VSUkVOVF9TQyksIENVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbiwgQ1VSUkVOVF9TQy0+cmVzaWQsIEdFVFNUQ05UKCkpOworCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUlNUQ05UKTsKKwlTRVRQT1JUKERNQUNOVFJMMCwgMCk7Cit9CisKKy8qCisgKiBkYXRhIG91dCBwaGFzZQorICoKKyAqLworc3RhdGljIHZvaWQgZGF0YW9faW5pdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlTRVRQT1JUKERNQUNOVFJMMCwgV1JJVEVfUkVBRCB8IFJTVEZJRk8pOworCVNFVFBPUlQoRE1BQ05UUkwwLCBXUklURV9SRUFEIHwgRU5ETUEpOworCisJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxfENMUlNUQ05UKTsKKwlTRVRQT1JUKFNYRlJDVEwwLCBDSDF8U0NTSUVOfERNQUVOKTsKKworCVNFVFBPUlQoU0lNT0RFMCwgMCk7CisJU0VUUE9SVChTSU1PREUxLCBFTlNDU0lQRVJSIHwgRU5TQ1NJUlNUIHwgRU5QSEFTRU1JUyB8IEVOQlVTRlJFRSApOworCisJREFUQV9MRU4gPSBDVVJSRU5UX1NDLT5yZXNpZDsKKworCURQUklOVEsoZGVidWdfZGF0YW8sCisJCURFQlVHX0xFQUQgImRhdGFvX2luaXQ6IHJlcXVlc3RfYnVmZmxlbj0lZDsgcmVzaWQ9JWRcbiIsCisJCUNNRElORk8oQ1VSUkVOVF9TQyksIENVUlJFTlRfU0MtPnJlcXVlc3RfYnVmZmxlbiwgQ1VSUkVOVF9TQy0+cmVzaWQpOworfQorCitzdGF0aWMgdm9pZCBkYXRhb19ydW4oc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJdW5zaWduZWQgbG9uZyB0aGVfdGltZTsKKwlpbnQgZGF0YV9jb3VudDsKKworCS8qIHVudGlsIHBoYXNlIGNoYW5nZXMgb3IgYWxsIGRhdGEgc2VudCAqLworCXdoaWxlKFRFU1RMTyhETUFTVEFULCBJTlRTVEFUKSAmJiBDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD4wKSB7CisJCWRhdGFfY291bnQgPSAxMjg7CisJCWlmKGRhdGFfY291bnQgPiBDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCkKKwkJCWRhdGFfY291bnQ9Q1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWw7CisKKwkJaWYoVEVTVExPKERNQVNUQVQsIERGSUZPRU1QKSkgeworCQkJcHJpbnRrKEVSUl9MRUFEICJkYXRhbyBmaWZvIG5vdCBlbXB0eSAoJWQpIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgR0VUUE9SVChGSUZPU1RBVCkpOworCQkJZGlzcF9wb3J0cyhzaHBudCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmKGRhdGFfY291bnQgJiAxKSB7CisJCQlTRVRQT1JUKERNQUNOVFJMMCxXUklURV9SRUFEfEVORE1BfF84QklUKTsKKwkJCVNFVFBPUlQoREFUQVBPUlQsICpDVVJSRU5UX1NDLT5TQ3AucHRyKyspOworCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwtLTsKKwkJCUNVUlJFTlRfU0MtPnJlc2lkLS07CisJCQlTRVRQT1JUKERNQUNOVFJMMCxXUklURV9SRUFEfEVORE1BKTsKKwkJfQorCisJCWlmKGRhdGFfY291bnQgPiAxKSB7CisJCQlkYXRhX2NvdW50ID4+PSAxOworCQkJb3V0c3coREFUQVBPUlQsIENVUlJFTlRfU0MtPlNDcC5wdHIsIGRhdGFfY291bnQpOworCQkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgKz0gMiAqIGRhdGFfY291bnQ7CisJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCAtPSAyICogZGF0YV9jb3VudDsKKwkJCUNVUlJFTlRfU0MtPnJlc2lkICAgICAgICAgICAgIC09IDIgKiBkYXRhX2NvdW50OworCSAgCX0KKworCQlpZihDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbD09MCAmJiBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbD4wKSB7CisJCQkvKiBhZHZhbmNlIHRvIG5leHQgYnVmZmVyICovCisJCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbC0tOworCQkJQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlcisrOworCQkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgPSBTR19BRERSRVNTKENVUlJFTlRfU0MtPlNDcC5idWZmZXIpOworCQkJQ1VSUkVOVF9TQy0+U0NwLnRoaXNfcmVzaWR1YWwgPSBDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyLT5sZW5ndGg7CisJCX0KKworCQl0aGVfdGltZT1qaWZmaWVzICsgMTAwKkhaOworCQl3aGlsZShURVNUTE8oRE1BU1RBVCwgREZJRk9FTVB8SU5UU1RBVCkgJiYgdGltZV9iZWZvcmUoamlmZmllcyx0aGVfdGltZSkpCisJCQliYXJyaWVyKCk7CisKKwkJaWYoVEVTVExPKERNQVNUQVQsIERGSUZPRU1QfElOVFNUQVQpKSB7CisJCQlwcmludGsoRVJSX0xFQUQgImRhdGFvdXQgdGltZW91dCIsIENNRElORk8oQ1VSUkVOVF9TQykpOworCQkJZGlzcF9wb3J0cyhzaHBudCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGF0YW9fZW5kKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCWlmKFRFU1RMTyhETUFTVEFULCBERklGT0VNUCkpIHsKKwkJaW50IGRhdGFfY291bnQgPSAoREFUQV9MRU4gLSBDVVJSRU5UX1NDLT5yZXNpZCkgLSBHRVRTVENOVCgpOworCisJCURQUklOVEsoZGVidWdfZGF0YW8sIERFQlVHX0xFQUQgImRhdGFvOiAlZCBieXRlcyB0byByZXNlbmQgKCVkIHdyaXR0ZW4sICVkIHRyYW5zZmVycmVkKVxuIiwKKwkJCUNNRElORk8oQ1VSUkVOVF9TQyksCisJCQlkYXRhX2NvdW50LAorCQkJREFUQV9MRU4tQ1VSUkVOVF9TQy0+cmVzaWQsCisJCQlHRVRTVENOVCgpKTsKKworCQlDVVJSRU5UX1NDLT5yZXNpZCArPSBkYXRhX2NvdW50OworCisJCWlmKENVUlJFTlRfU0MtPnVzZV9zZykgeworCQkJZGF0YV9jb3VudCAtPSBDVVJSRU5UX1NDLT5TQ3AucHRyIC0gU0dfQUREUkVTUyhDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyKTsKKwkJCXdoaWxlKGRhdGFfY291bnQ+MCkgeworCQkJCUNVUlJFTlRfU0MtPlNDcC5idWZmZXItLTsKKwkJCQlDVVJSRU5UX1NDLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCsrOworCQkJCWRhdGFfY291bnQgLT0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoOworCQkJfQorCQkJQ1VSUkVOVF9TQy0+U0NwLnB0ciAgICAgICAgICAgPSBTR19BRERSRVNTKENVUlJFTlRfU0MtPlNDcC5idWZmZXIpIC0gZGF0YV9jb3VudDsKKwkJCUNVUlJFTlRfU0MtPlNDcC50aGlzX3Jlc2lkdWFsID0gQ1VSUkVOVF9TQy0+U0NwLmJ1ZmZlci0+bGVuZ3RoICsgZGF0YV9jb3VudDsKKwkJfSBlbHNlIHsKKwkJCUNVUlJFTlRfU0MtPlNDcC5wdHIgICAgICAgICAgIC09IGRhdGFfY291bnQ7CisJCQlDVVJSRU5UX1NDLT5TQ3AudGhpc19yZXNpZHVhbCArPSBkYXRhX2NvdW50OworCQl9CisJfQorCisJRFBSSU5USyhkZWJ1Z19kYXRhbywgREVCVUdfTEVBRCAiZGF0YW9fZW5kOiByZXF1ZXN0X2J1ZmZsZW49JWQ7IHJlc2lkPSVkOyBzdGNudD0lZFxuIiwKKwkJQ01ESU5GTyhDVVJSRU5UX1NDKSwKKwkJQ1VSUkVOVF9TQy0+cmVxdWVzdF9idWZmbGVuLAorCQlDVVJSRU5UX1NDLT5yZXNpZCwKKwkJR0VUU1RDTlQoKSk7CisKKwlTRVRQT1JUKFNYRlJDVEwwLCBDSDF8Q0xSQ0gxfENMUlNUQ05UKTsKKwlTRVRQT1JUKFNYRlJDVEwwLCBDSDEpOworCisJU0VUUE9SVChETUFDTlRSTDAsIDApOworfQorCisvKgorICogZmlndXJlIG91dCB3aGF0IHN0YXRlIHdlJ3JlIGluCisgKgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9zdGF0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlpbnQgZGF0YXBoYXNlPTA7CisJdW5zaWduZWQgaW50IHN0YXQwID0gR0VUUE9SVChTU1RBVDApOworCXVuc2lnbmVkIGludCBzdGF0MSA9IEdFVFBPUlQoU1NUQVQxKTsKKworCVBSRVZTVEFURSA9IFNUQVRFOworCVNUQVRFPXVua25vd247CisKKwlpZihzdGF0MSAmIFNDU0lSU1RJKSB7CisJCVNUQVRFPXJzdGk7CisJCVNFVFBPUlQoU0NTSVNFUSwwKTsKKwkJU0VUUE9SVChTU1RBVDEsU0NTSVJTVEkpOworICAJfSBlbHNlIGlmKHN0YXQwICYgU0VMREkgJiYgUFJFVlNUQVRFPT1idXNmcmVlKSB7CisJCVNUQVRFPXNlbGRpOworCX0gZWxzZSBpZihzdGF0MCAmIFNFTERPICYmIENVUlJFTlRfU0MgJiYgKENVUlJFTlRfU0MtPlNDcC5waGFzZSAmIHNlbGVjdGluZykpIHsKKwkJU1RBVEU9c2VsZG87CisJfSBlbHNlIGlmKHN0YXQxICYgU0VMVE8pIHsKKwkJU1RBVEU9c2VsdG87CisJfSBlbHNlIGlmKHN0YXQxICYgQlVTRlJFRSkgeworCQlTVEFURT1idXNmcmVlOworCQlTRVRQT1JUKFNTVEFUMSxCVVNGUkVFKTsKKwl9IGVsc2UgaWYoc3RhdDEgJiBTQ1NJUEVSUikgeworCQlTVEFURT1wYXJlcnI7CisJCVNFVFBPUlQoU1NUQVQxLFNDU0lQRVJSKTsKKwl9IGVsc2UgaWYoc3RhdDEgJiBSRVFJTklUKSB7CisJCXN3aXRjaChHRVRQT1JUKFNDU0lTSUcpICYgUF9NQVNLKSB7CisJCWNhc2UgUF9NU0dJOglTVEFURT1tc2dpOwlicmVhazsKKwkJY2FzZSBQX01TR086CVNUQVRFPW1zZ287CWJyZWFrOworCQljYXNlIFBfREFUQU86CVNUQVRFPWRhdGFvOwlicmVhazsKKwkJY2FzZSBQX0RBVEFJOglTVEFURT1kYXRhaTsJYnJlYWs7CisJCWNhc2UgUF9TVEFUVVM6CVNUQVRFPXN0YXR1czsJYnJlYWs7CisJCWNhc2UgUF9DTUQ6CVNUQVRFPWNtZDsJYnJlYWs7CisJCX0KKwkJZGF0YXBoYXNlPTE7CisJfQorCisJaWYoKHN0YXQwICYgU0VMREkpICYmIFNUQVRFIT1zZWxkaSAmJiAhZGF0YXBoYXNlKSB7CisJCXByaW50ayhJTkZPX0xFQUQgInJlc2VsZWN0aW9uIG1pc3NlZD8iLCBDTURJTkZPKENVUlJFTlRfU0MpKTsKKwkJZGlzcF9wb3J0cyhzaHBudCk7CisJfQorCisJaWYoU1RBVEUhPVBSRVZTVEFURSkgeworCQlMQVNUU1RBVEU9UFJFVlNUQVRFOworCX0KKworCXJldHVybiBkYXRhcGhhc2U7Cit9CisKKy8qCisgKiBoYW5kbGUgcGFyaXR5IGVycm9yCisgKgorICogRklYTUU6IGluIHdoaWNoIHBoYXNlPworICoKKyAqLworc3RhdGljIHZvaWQgcGFyZXJyX3J1bihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKwlwcmludGsoRVJSX0xFQUQgInBhcml0eSBlcnJvclxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSk7CisJZG9uZShzaHBudCwgRElEX1BBUklUWSA8PCAxNik7Cit9CisKKy8qCisgKiBoYW5kbGUgcmVzZXQgaW4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHJzdGlfcnVuKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KQoreworCVNjc2lfQ21uZCAqcHRyOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJhaGExNTJ4JWQ6IHNjc2kgcmVzZXQgaW5cbiIsIEhPU1ROTyk7CisJCisJcHRyPURJU0NPTk5FQ1RFRF9TQzsKKwl3aGlsZShwdHIpIHsKKwkJU2NzaV9DbW5kICpuZXh0ID0gU0NORVhUKHB0cik7CisKKwkJaWYgKCFwdHItPmRldmljZS0+c29mdF9yZXNldCkgeworCQkJcmVtb3ZlX1NDKCZESVNDT05ORUNURURfU0MsIHB0cik7CisKKwkJCWtmcmVlKHB0ci0+aG9zdF9zY3JpYmJsZSk7CisJCQlwdHItPmhvc3Rfc2NyaWJibGU9TlVMTDsKKworCQkJcHRyLT5yZXN1bHQgPSAgRElEX1JFU0VUIDw8IDE2OworCQkJcHRyLT5zY3NpX2RvbmUocHRyKTsKKwkJfQorCisJCXB0ciA9IG5leHQ7CisJfQorCisJaWYoQ1VSUkVOVF9TQyAmJiAhQ1VSUkVOVF9TQy0+ZGV2aWNlLT5zb2Z0X3Jlc2V0KQorCQlkb25lKHNocG50LCBESURfUkVTRVQgPDwgMTYgKTsKK30KKworCisvKgorICogYm90dG9tLWhhbGYgaGFuZGxlcgorICoKKyAqLworc3RhdGljIHZvaWQgaXNfY29tcGxldGUoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaW50IGRhdGFwaGFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwZW5kaW5nOworCisJRE9fTE9DSyhmbGFncyk7CisJaWYoSE9TVERBVEEoc2hwbnQpLT5pbl9pbnRyKSB7CisJCURPX1VOTE9DSyhmbGFncyk7CisJCS8qIGFoYTE1MnhfZXJyb3IgbmV2ZXIgcmV0dXJucy4uICovCisJCWFoYTE1MnhfZXJyb3Ioc2hwbnQsICJib3R0b20taGFsZiBhbHJlYWR5IHJ1bm5pbmchPyIpOworCX0KKwlIT1NUREFUQShzaHBudCktPmluX2ludHIrKzsKKworCS8qCisJICogbG9vcCB3aGlsZSB0aGVyZSBhcmUgaW50ZXJydXB0IGNvbmRpdGlvbnMgcGVuZGluZworCSAqCisJICovCisJZG8geworCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsKKwkJRE9fVU5MT0NLKGZsYWdzKTsKKworCQlkYXRhcGhhc2U9dXBkYXRlX3N0YXRlKHNocG50KTsKKworCQlEUFJJTlRLKGRlYnVnX3BoYXNlcywgTEVBRCAic3RhcnQgJXMgJXMoJXMpXG4iLCBDTURJTkZPKENVUlJFTlRfU0MpLCBzdGF0ZXNbU1RBVEVdLm5hbWUsIHN0YXRlc1tQUkVWU1RBVEVdLm5hbWUsIHN0YXRlc1tMQVNUU1RBVEVdLm5hbWUpOworCisJCS8qCisJCSAqIGVuZCBwcmV2aW91cyBzdGF0ZQorCQkgKgorCQkgKi8KKwkJaWYoUFJFVlNUQVRFIT1TVEFURSAmJiBzdGF0ZXNbUFJFVlNUQVRFXS5lbmQpCisJCQlzdGF0ZXNbUFJFVlNUQVRFXS5lbmQoc2hwbnQpOworCisJCS8qCisJCSAqIGRpc2FibGUgU1BJTyBtb2RlIGlmIHByZXZpb3VzIHBoYXNlIHVzZWQgaXQKKwkJICogYW5kIHRoaXMgb25lIGRvZXNuJ3QKKwkJICoKKwkJICovCisJCWlmKHN0YXRlc1tQUkVWU1RBVEVdLnNwaW8gJiYgIXN0YXRlc1tTVEFURV0uc3BpbykgeworCQkJU0VUUE9SVChTWEZSQ1RMMCwgQ0gxKTsKKwkJCVNFVFBPUlQoRE1BQ05UUkwwLCAwKTsKKwkJCWlmKENVUlJFTlRfU0MpCisJCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlICY9IH5zcGlvcmR5OworCQl9CisKKwkJLyoKKwkJICogYWNjZXB0IGN1cnJlbnQgZGF0YXBoYXNlIHBoYXNlCisJCSAqCisJCSAqLworCQlpZihkYXRhcGhhc2UpIHsKKwkJCVNFVFBPUlQoU1NUQVQwLCBSRVFJTklUKTsKKwkJCVNFVFBPUlQoU0NTSVNJRywgR0VUUE9SVChTQ1NJU0lHKSAmIFBfTUFTSyk7CisJCQlTRVRQT1JUKFNTVEFUMSwgUEhBU0VDSEcpOyAgCisJCX0KKwkJCisJCS8qCisJCSAqIGVuYWJsZSBTUElPIG1vZGUgaWYgcHJldmlvdXMgZGlkbid0IHVzZSBpdAorCQkgKiBhbmQgdGhpcyBvbmUgZG9lcworCQkgKgorCQkgKi8KKwkJaWYoIXN0YXRlc1tQUkVWU1RBVEVdLnNwaW8gJiYgc3RhdGVzW1NUQVRFXS5zcGlvKSB7CisJCQlTRVRQT1JUKERNQUNOVFJMMCwgMCk7CisJCQlTRVRQT1JUKFNYRlJDVEwwLCBDSDF8U1BJT0VOKTsKKwkJCWlmKENVUlJFTlRfU0MpCisJCQkJQ1VSUkVOVF9TQy0+U0NwLnBoYXNlIHw9IHNwaW9yZHk7CisJCX0KKwkJCisJCS8qCisJCSAqIGluaXRpYWxpemUgZm9yIG5ldyBzdGF0ZQorCQkgKgorCQkgKi8KKwkJaWYoUFJFVlNUQVRFIT1TVEFURSAmJiBzdGF0ZXNbU1RBVEVdLmluaXQpCisJCQlzdGF0ZXNbU1RBVEVdLmluaXQoc2hwbnQpOworCQkKKwkJLyoKKwkJICogaGFuZGxlIGN1cnJlbnQgc3RhdGUKKwkJICoKKwkJICovCisJCWlmKHN0YXRlc1tTVEFURV0ucnVuKQorCQkJc3RhdGVzW1NUQVRFXS5ydW4oc2hwbnQpOworCQllbHNlCisJCQlwcmludGsoRVJSX0xFQUQgInVuZXhwZWN0ZWQgc3RhdGUgKCV4KVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgU1RBVEUpOworCQkKKwkJLyoKKwkJICogc2V0dXAgY29udHJvbGxlciB0byBpbnRlcnJ1cHQgb24KKwkJICogdGhlIG5leHQgZXhwZWN0ZWQgY29uZGl0aW9uIGFuZAorCQkgKiBsb29wIGlmIGl0J3MgYWxyZWFkeSB0aGVyZQorCQkgKgorCQkgKi8KKwkJRE9fTE9DSyhmbGFncyk7CisJCXBlbmRpbmc9c2V0dXBfZXhwZWN0ZWRfaW50ZXJydXB0cyhzaHBudCk7CisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJCUhPU1REQVRBKHNocG50KS0+Y291bnRbU1RBVEVdKys7CisJCWlmKFBSRVZTVEFURSE9U1RBVEUpCisJCQlIT1NUREFUQShzaHBudCktPmNvdW50X3RyYW5zW1NUQVRFXSsrOworCQlIT1NUREFUQShzaHBudCktPnRpbWVbU1RBVEVdICs9IGppZmZpZXMtc3RhcnQ7CisjZW5kaWYKKworCQlEUFJJTlRLKGRlYnVnX3BoYXNlcywgTEVBRCAiZW5kICVzICVzKCVzKVxuIiwgQ01ESU5GTyhDVVJSRU5UX1NDKSwgc3RhdGVzW1NUQVRFXS5uYW1lLCBzdGF0ZXNbUFJFVlNUQVRFXS5uYW1lLCBzdGF0ZXNbTEFTVFNUQVRFXS5uYW1lKTsKKwl9IHdoaWxlKHBlbmRpbmcpOworCisJLyoKKwkgKiBlbmFibGUgaW50ZXJydXB0cyBhbmQgbGVhdmUgYm90dG9tLWhhbGYKKwkgKgorCSAqLworCUhPU1REQVRBKHNocG50KS0+aW5faW50ci0tOworCVNFVEJJVFMoRE1BQ05UUkwwLCBJTlRFTik7CisJRE9fVU5MT0NLKGZsYWdzKTsKK30KKworCisvKiAKKyAqIER1bXAgdGhlIGN1cnJlbnQgZHJpdmVyIHN0YXR1cyBhbmQgcGFuaWMKKyAqLworc3RhdGljIHZvaWQgYWhhMTUyeF9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCwgY2hhciAqbXNnKQoreworCXByaW50ayhLRVJOX0VNRVJHICJcbmFoYTE1MnglZDogJXNcbiIsIEhPU1ROTywgbXNnKTsKKwlzaG93X3F1ZXVlcyhzaHBudCk7CisJcGFuaWMoImFoYTE1MnggcGFuaWNcbiIpOworfQorCisvKgorICogRGlzcGxheSByZWdpc3RlcnMgb2YgQUlDLTYyNjAKKyAqLworc3RhdGljIHZvaWQgZGlzcF9wb3J0cyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCkKK3sKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJaW50IHM7CisKKwlwcmludGsoIlxuJXM6ICVzKCVzKSAiLAorCQlDVVJSRU5UX1NDID8gImJ1c3kiIDogIndhaXRpbmciLAorCQlzdGF0ZXNbU1RBVEVdLm5hbWUsCisJCXN0YXRlc1tQUkVWU1RBVEVdLm5hbWUpOworCisJcyA9IEdFVFBPUlQoU0NTSVNFUSk7CisJcHJpbnRrKCJTQ1NJU0VRKCAiKTsKKwlpZiAocyAmIFRFTU9ERU8pCisJCXByaW50aygiVEFSR0VUIE1PREUgIik7CisJaWYgKHMgJiBFTlNFTE8pCisJCXByaW50aygiU0VMTyAiKTsKKwlpZiAocyAmIEVOU0VMSSkKKwkJcHJpbnRrKCJTRUxJICIpOworCWlmIChzICYgRU5SRVNFTEkpCisJCXByaW50aygiUkVTRUxJICIpOworCWlmIChzICYgRU5BVVRPQVROTykKKwkJcHJpbnRrKCJBVVRPQVROTyAiKTsKKwlpZiAocyAmIEVOQVVUT0FUTkkpCisJCXByaW50aygiQVVUT0FUTkkgIik7CisJaWYgKHMgJiBFTkFVVE9BVE5QKQorCQlwcmludGsoIkFVVE9BVE5QICIpOworCWlmIChzICYgU0NTSVJTVE8pCisJCXByaW50aygiU0NTSVJTVE8gIik7CisJcHJpbnRrKCIpOyIpOworCisJcHJpbnRrKCIgU0NTSVNJRygiKTsKKwlzID0gR0VUUE9SVChTQ1NJU0lHKTsKKwlzd2l0Y2ggKHMgJiBQX01BU0spIHsKKwljYXNlIFBfREFUQU86CisJCXByaW50aygiREFUQSBPVVQiKTsKKwkJYnJlYWs7CisJY2FzZSBQX0RBVEFJOgorCQlwcmludGsoIkRBVEEgSU4iKTsKKwkJYnJlYWs7CisJY2FzZSBQX0NNRDoKKwkJcHJpbnRrKCJDT01NQU5EIik7CisJCWJyZWFrOworCWNhc2UgUF9TVEFUVVM6CisJCXByaW50aygiU1RBVFVTIik7CisJCWJyZWFrOworCWNhc2UgUF9NU0dPOgorCQlwcmludGsoIk1FU1NBR0UgT1VUIik7CisJCWJyZWFrOworCWNhc2UgUF9NU0dJOgorCQlwcmludGsoIk1FU1NBR0UgSU4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCIqaW52YWxpZCoiKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKCIpOyAiKTsKKworCXByaW50aygiSU5UU1RBVCAoJXMpOyAiLCBURVNUSEkoRE1BU1RBVCwgSU5UU1RBVCkgPyAiaGkiIDogImxvIik7CisKKwlwcmludGsoIlNTVEFUKCAiKTsKKwlzID0gR0VUUE9SVChTU1RBVDApOworCWlmIChzICYgVEFSR0VUKQorCQlwcmludGsoIlRBUkdFVCAiKTsKKwlpZiAocyAmIFNFTERPKQorCQlwcmludGsoIlNFTERPICIpOworCWlmIChzICYgU0VMREkpCisJCXByaW50aygiU0VMREkgIik7CisJaWYgKHMgJiBTRUxJTkdPKQorCQlwcmludGsoIlNFTElOR08gIik7CisJaWYgKHMgJiBTV1JBUCkKKwkJcHJpbnRrKCJTV1JBUCAiKTsKKwlpZiAocyAmIFNET05FKQorCQlwcmludGsoIlNET05FICIpOworCWlmIChzICYgU1BJT1JEWSkKKwkJcHJpbnRrKCJTUElPUkRZICIpOworCWlmIChzICYgRE1BRE9ORSkKKwkJcHJpbnRrKCJETUFET05FICIpOworCisJcyA9IEdFVFBPUlQoU1NUQVQxKTsKKwlpZiAocyAmIFNFTFRPKQorCQlwcmludGsoIlNFTFRPICIpOworCWlmIChzICYgQVROVEFSRykKKwkJcHJpbnRrKCJBVE5UQVJHICIpOworCWlmIChzICYgU0NTSVJTVEkpCisJCXByaW50aygiU0NTSVJTVEkgIik7CisJaWYgKHMgJiBQSEFTRU1JUykKKwkJcHJpbnRrKCJQSEFTRU1JUyAiKTsKKwlpZiAocyAmIEJVU0ZSRUUpCisJCXByaW50aygiQlVTRlJFRSAiKTsKKwlpZiAocyAmIFNDU0lQRVJSKQorCQlwcmludGsoIlNDU0lQRVJSICIpOworCWlmIChzICYgUEhBU0VDSEcpCisJCXByaW50aygiUEhBU0VDSEcgIik7CisJaWYgKHMgJiBSRVFJTklUKQorCQlwcmludGsoIlJFUUlOSVQgIik7CisJcHJpbnRrKCIpOyAiKTsKKworCisJcHJpbnRrKCJTU1RBVCggIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDApICYgR0VUUE9SVChTSU1PREUwKTsKKworCWlmIChzICYgVEFSR0VUKQorCQlwcmludGsoIlRBUkdFVCAiKTsKKwlpZiAocyAmIFNFTERPKQorCQlwcmludGsoIlNFTERPICIpOworCWlmIChzICYgU0VMREkpCisJCXByaW50aygiU0VMREkgIik7CisJaWYgKHMgJiBTRUxJTkdPKQorCQlwcmludGsoIlNFTElOR08gIik7CisJaWYgKHMgJiBTV1JBUCkKKwkJcHJpbnRrKCJTV1JBUCAiKTsKKwlpZiAocyAmIFNET05FKQorCQlwcmludGsoIlNET05FICIpOworCWlmIChzICYgU1BJT1JEWSkKKwkJcHJpbnRrKCJTUElPUkRZICIpOworCWlmIChzICYgRE1BRE9ORSkKKwkJcHJpbnRrKCJETUFET05FICIpOworCisJcyA9IEdFVFBPUlQoU1NUQVQxKSAmIEdFVFBPUlQoU0lNT0RFMSk7CisKKwlpZiAocyAmIFNFTFRPKQorCQlwcmludGsoIlNFTFRPICIpOworCWlmIChzICYgQVROVEFSRykKKwkJcHJpbnRrKCJBVE5UQVJHICIpOworCWlmIChzICYgU0NTSVJTVEkpCisJCXByaW50aygiU0NTSVJTVEkgIik7CisJaWYgKHMgJiBQSEFTRU1JUykKKwkJcHJpbnRrKCJQSEFTRU1JUyAiKTsKKwlpZiAocyAmIEJVU0ZSRUUpCisJCXByaW50aygiQlVTRlJFRSAiKTsKKwlpZiAocyAmIFNDU0lQRVJSKQorCQlwcmludGsoIlNDU0lQRVJSICIpOworCWlmIChzICYgUEhBU0VDSEcpCisJCXByaW50aygiUEhBU0VDSEcgIik7CisJaWYgKHMgJiBSRVFJTklUKQorCQlwcmludGsoIlJFUUlOSVQgIik7CisJcHJpbnRrKCIpOyAiKTsKKworCXByaW50aygiU1hGUkNUTDAoICIpOworCisJcyA9IEdFVFBPUlQoU1hGUkNUTDApOworCWlmIChzICYgU0NTSUVOKQorCQlwcmludGsoIlNDU0lFTiAiKTsKKwlpZiAocyAmIERNQUVOKQorCQlwcmludGsoIkRNQUVOICIpOworCWlmIChzICYgQ0gxKQorCQlwcmludGsoIkNIMSAiKTsKKwlpZiAocyAmIENMUlNUQ05UKQorCQlwcmludGsoIkNMUlNUQ05UICIpOworCWlmIChzICYgU1BJT0VOKQorCQlwcmludGsoIlNQSU9FTiAiKTsKKwlpZiAocyAmIENMUkNIMSkKKwkJcHJpbnRrKCJDTFJDSDEgIik7CisJcHJpbnRrKCIpOyAiKTsKKworCXByaW50aygiU0lHTkFMKCAiKTsKKworCXMgPSBHRVRQT1JUKFNDU0lTSUcpOworCWlmIChzICYgU0lHX0FUTkkpCisJCXByaW50aygiQVROSSAiKTsKKwlpZiAocyAmIFNJR19TRUxJKQorCQlwcmludGsoIlNFTEkgIik7CisJaWYgKHMgJiBTSUdfQlNZSSkKKwkJcHJpbnRrKCJCU1lJICIpOworCWlmIChzICYgU0lHX1JFUUkpCisJCXByaW50aygiUkVRSSAiKTsKKwlpZiAocyAmIFNJR19BQ0tJKQorCQlwcmludGsoIkFDS0kgIik7CisJcHJpbnRrKCIpOyAiKTsKKworCXByaW50aygiU0VMSUQgKCUwMngpLCAiLCBHRVRQT1JUKFNFTElEKSk7CisKKwlwcmludGsoIlNUQ05UICglZCksICIsIEdFVFNUQ05UKCkpOworCQorCXByaW50aygiU1NUQVQyKCAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMik7CisJaWYgKHMgJiBTT0ZGU0VUKQorCQlwcmludGsoIlNPRkZTRVQgIik7CisJaWYgKHMgJiBTRU1QVFkpCisJCXByaW50aygiU0VNUFRZICIpOworCWlmIChzICYgU0ZVTEwpCisJCXByaW50aygiU0ZVTEwgIik7CisJcHJpbnRrKCIpOyBTRkNOVCAoJWQpOyAiLCBzICYgKFNGVUxMIHwgU0ZDTlQpKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMyk7CisJcHJpbnRrKCJTQ1NJQ05UICglZCksIE9GRkNOVCglZCksICIsIChzICYgMHhmMCkgPj4gNCwgcyAmIDB4MGYpOworCisJcHJpbnRrKCJTU1RBVDQoICIpOworCXMgPSBHRVRQT1JUKFNTVEFUNCk7CisJaWYgKHMgJiBTWU5DRVJSKQorCQlwcmludGsoIlNZTkNFUlIgIik7CisJaWYgKHMgJiBGV0VSUikKKwkJcHJpbnRrKCJGV0VSUiAiKTsKKwlpZiAocyAmIEZSRVJSKQorCQlwcmludGsoIkZSRVJSICIpOworCXByaW50aygiKTsgIik7CisKKwlwcmludGsoIkRNQUNOVFJMMCggIik7CisJcyA9IEdFVFBPUlQoRE1BQ05UUkwwKTsKKwlwcmludGsoIiVzICIsIHMgJiBfOEJJVCA/ICI4QklUIiA6ICIxNkJJVCIpOworCXByaW50aygiJXMgIiwgcyAmIERNQSA/ICJETUEiIDogIlBJTyIpOworCXByaW50aygiJXMgIiwgcyAmIFdSSVRFX1JFQUQgPyAiV1JJVEUiIDogIlJFQUQiKTsKKwlpZiAocyAmIEVORE1BKQorCQlwcmludGsoIkVORE1BICIpOworCWlmIChzICYgSU5URU4pCisJCXByaW50aygiSU5URU4gIik7CisJaWYgKHMgJiBSU1RGSUZPKQorCQlwcmludGsoIlJTVEZJRk8gIik7CisJaWYgKHMgJiBTV0lOVCkKKwkJcHJpbnRrKCJTV0lOVCAiKTsKKwlwcmludGsoIik7ICIpOworCisJcHJpbnRrKCJETUFTVEFUKCAiKTsKKwlzID0gR0VUUE9SVChETUFTVEFUKTsKKwlpZiAocyAmIEFURE9ORSkKKwkJcHJpbnRrKCJBVERPTkUgIik7CisJaWYgKHMgJiBXT1JEUkRZKQorCQlwcmludGsoIldPUkRSRFkgIik7CisJaWYgKHMgJiBERklGT0ZVTEwpCisJCXByaW50aygiREZJRk9GVUxMICIpOworCWlmIChzICYgREZJRk9FTVApCisJCXByaW50aygiREZJRk9FTVAgIik7CisJcHJpbnRrKCIpXG4iKTsKKyNlbmRpZgorfQorCisvKgorICogZGlzcGxheSBlbmFibGVkIGludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgZGlzcF9lbmludHIoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaW50IHM7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiZW5hYmxlZCBpbnRlcnJ1cHRzICggIik7CisKKwlzID0gR0VUUE9SVChTSU1PREUwKTsKKwlpZiAocyAmIEVOU0VMRE8pCisJCXByaW50aygiRU5TRUxETyAiKTsKKwlpZiAocyAmIEVOU0VMREkpCisJCXByaW50aygiRU5TRUxESSAiKTsKKwlpZiAocyAmIEVOU0VMSU5HTykKKwkJcHJpbnRrKCJFTlNFTElOR08gIik7CisJaWYgKHMgJiBFTlNXUkFQKQorCQlwcmludGsoIkVOU1dSQVAgIik7CisJaWYgKHMgJiBFTlNET05FKQorCQlwcmludGsoIkVOU0RPTkUgIik7CisJaWYgKHMgJiBFTlNQSU9SRFkpCisJCXByaW50aygiRU5TUElPUkRZICIpOworCWlmIChzICYgRU5ETUFET05FKQorCQlwcmludGsoIkVORE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNJTU9ERTEpOworCWlmIChzICYgRU5TRUxUSU1PKQorCQlwcmludGsoIkVOU0VMVElNTyAiKTsKKwlpZiAocyAmIEVOQVROVEFSRykKKwkJcHJpbnRrKCJFTkFUTlRBUkcgIik7CisJaWYgKHMgJiBFTlBIQVNFTUlTKQorCQlwcmludGsoIkVOUEhBU0VNSVMgIik7CisJaWYgKHMgJiBFTkJVU0ZSRUUpCisJCXByaW50aygiRU5CVVNGUkVFICIpOworCWlmIChzICYgRU5TQ1NJUEVSUikKKwkJcHJpbnRrKCJFTlNDU0lQRVJSICIpOworCWlmIChzICYgRU5QSEFTRUNIRykKKwkJcHJpbnRrKCJFTlBIQVNFQ0hHICIpOworCWlmIChzICYgRU5SRVFJTklUKQorCQlwcmludGsoIkVOUkVRSU5JVCAiKTsKKwlwcmludGsoIilcbiIpOworfQorCisvKgorICogU2hvdyB0aGUgY29tbWFuZCBkYXRhIG9mIGEgY29tbWFuZAorICovCitzdGF0aWMgdm9pZCBzaG93X2NvbW1hbmQoU2NzaV9DbW5kICpwdHIpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIjB4JTA4eDogdGFyZ2V0PSVkOyBsdW49JWQ7IGNtbmQ9KCIsCisJICAgICAgICh1bnNpZ25lZCBpbnQpIHB0ciwgcHRyLT5kZXZpY2UtPmlkLCBwdHItPmRldmljZS0+bHVuKTsKKworCXByaW50X2NvbW1hbmQocHRyLT5jbW5kKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIpOyByZXF1ZXN0X2J1ZmZsZW49JWQ7IHJlc2lkPSVkOyBwaGFzZSB8IiwKKwkgICAgICAgcHRyLT5yZXF1ZXN0X2J1ZmZsZW4sIHB0ci0+cmVzaWQpOworCisJaWYgKHB0ci0+U0NwLnBoYXNlICYgbm90X2lzc3VlZCkKKwkJcHJpbnRrKCJub3QgaXNzdWVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIHNlbGVjdGluZykKKwkJcHJpbnRrKCJzZWxlY3Rpbmd8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgaWRlbnRpZmllZCkKKwkJcHJpbnRrKCJpZGVudGlmaWVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGRpc2Nvbm5lY3RlZCkKKwkJcHJpbnRrKCJkaXNjb25uZWN0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgY29tcGxldGVkKQorCQlwcmludGsoImNvbXBsZXRlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBzcGlvcmR5KQorCQlwcmludGsoInNwaW9yZHl8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3luY25lZykKKwkJcHJpbnRrKCJzeW5jbmVnfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGFib3J0ZWQpCisJCXByaW50aygiYWJvcnRlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiByZXNldHRlZCkKKwkJcHJpbnRrKCJyZXNldHRlZHwiKTsKKwlpZiggU0NEQVRBKHB0cikgKSB7CisJCXByaW50aygiOyBuZXh0PTB4JXBcbiIsIFNDTkVYVChwdHIpKTsKKwl9IGVsc2UgeworCQlwcmludGsoIjsgbmV4dD0oaG9zdCBzY3JpYmJsZSBOVUxMKVxuIik7CisJfQorfQorCisvKgorICogRHVtcCB0aGUgcXVldWVkIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2hvd19xdWV1ZXMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJU2NzaV9DbW5kICpwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURPX0xPQ0soZmxhZ3MpOworCXByaW50ayhLRVJOX0RFQlVHICJcbnF1ZXVlIHN0YXR1czpcbmlzc3VlX1NDOlxuIik7CisJZm9yIChwdHIgPSBJU1NVRV9TQzsgcHRyOyBwdHIgPSBTQ05FWFQocHRyKSkKKwkJc2hvd19jb21tYW5kKHB0cik7CisJRE9fVU5MT0NLKGZsYWdzKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJjdXJyZW50X1NDOlxuIik7CisJaWYgKENVUlJFTlRfU0MpCisJCXNob3dfY29tbWFuZChDVVJSRU5UX1NDKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJub25lXG4iKTsKKworCXByaW50ayhLRVJOX0RFQlVHICJkaXNjb25uZWN0ZWRfU0M6XG4iKTsKKwlmb3IgKHB0ciA9IERJU0NPTk5FQ1RFRF9TQzsgcHRyOyBwdHIgPSBTQ0RBVEEocHRyKSA/IFNDTkVYVChwdHIpIDogTlVMTCkKKwkJc2hvd19jb21tYW5kKHB0cik7CisKKwlkaXNwX3BvcnRzKHNocG50KTsKKwlkaXNwX2VuaW50cihzaHBudCk7Cit9CisKKyN1bmRlZiBTUFJJTlRGCisjZGVmaW5lIFNQUklOVEYoYXJncy4uLikgcG9zICs9IHNwcmludGYocG9zLCAjIyBhcmdzKQorCitzdGF0aWMgaW50IGdldF9jb21tYW5kKGNoYXIgKnBvcywgU2NzaV9DbW5kICogcHRyKQoreworCWNoYXIgKnN0YXJ0ID0gcG9zOworCWludCBpOworCisJU1BSSU5URigiMHglMDh4OiB0YXJnZXQ9JWQ7IGx1bj0lZDsgY21uZD0oICIsCisJCSh1bnNpZ25lZCBpbnQpIHB0ciwgcHRyLT5kZXZpY2UtPmlkLCBwdHItPmRldmljZS0+bHVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBDT01NQU5EX1NJWkUocHRyLT5jbW5kWzBdKTsgaSsrKQorCQlTUFJJTlRGKCIweCUwMnggIiwgcHRyLT5jbW5kW2ldKTsKKworCVNQUklOVEYoIik7IHJlc2lkPSVkOyByZXNpZHVhbD0lZDsgYnVmZmVycz0lZDsgcGhhc2UgfCIsCisJCXB0ci0+cmVzaWQsIHB0ci0+U0NwLnRoaXNfcmVzaWR1YWwsIHB0ci0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpOworCisJaWYgKHB0ci0+U0NwLnBoYXNlICYgbm90X2lzc3VlZCkKKwkJU1BSSU5URigibm90IGlzc3VlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBzZWxlY3RpbmcpCisJCVNQUklOVEYoInNlbGVjdGluZ3wiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBkaXNjb25uZWN0ZWQpCisJCVNQUklOVEYoImRpc2Nvbm5lY3RlZHwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBhYm9ydGVkKQorCQlTUFJJTlRGKCJhYm9ydGVkfCIpOworCWlmIChwdHItPlNDcC5waGFzZSAmIGlkZW50aWZpZWQpCisJCVNQUklOVEYoImlkZW50aWZpZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgY29tcGxldGVkKQorCQlTUFJJTlRGKCJjb21wbGV0ZWR8Iik7CisJaWYgKHB0ci0+U0NwLnBoYXNlICYgc3Bpb3JkeSkKKwkJU1BSSU5URigic3Bpb3JkeXwiKTsKKwlpZiAocHRyLT5TQ3AucGhhc2UgJiBzeW5jbmVnKQorCQlTUFJJTlRGKCJzeW5jbmVnfCIpOworCVNQUklOVEYoIjsgbmV4dD0weCVwXG4iLCBTQ05FWFQocHRyKSk7CisKKwlyZXR1cm4gKHBvcyAtIHN0YXJ0KTsKK30KKworc3RhdGljIGludCBnZXRfcG9ydHMoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQsIGNoYXIgKnBvcykKK3sKKwljaGFyICpzdGFydCA9IHBvczsKKwlpbnQgczsKKworCVNQUklOVEYoIlxuJXM6ICVzKCVzKSAiLCBDVVJSRU5UX1NDID8gIm9uIGJ1cyIgOiAid2FpdGluZyIsIHN0YXRlc1tTVEFURV0ubmFtZSwgc3RhdGVzW1BSRVZTVEFURV0ubmFtZSk7CisKKwlzID0gR0VUUE9SVChTQ1NJU0VRKTsKKwlTUFJJTlRGKCJTQ1NJU0VRKCAiKTsKKwlpZiAocyAmIFRFTU9ERU8pCisJCVNQUklOVEYoIlRBUkdFVCBNT0RFICIpOworCWlmIChzICYgRU5TRUxPKQorCQlTUFJJTlRGKCJTRUxPICIpOworCWlmIChzICYgRU5TRUxJKQorCQlTUFJJTlRGKCJTRUxJICIpOworCWlmIChzICYgRU5SRVNFTEkpCisJCVNQUklOVEYoIlJFU0VMSSAiKTsKKwlpZiAocyAmIEVOQVVUT0FUTk8pCisJCVNQUklOVEYoIkFVVE9BVE5PICIpOworCWlmIChzICYgRU5BVVRPQVROSSkKKwkJU1BSSU5URigiQVVUT0FUTkkgIik7CisJaWYgKHMgJiBFTkFVVE9BVE5QKQorCQlTUFJJTlRGKCJBVVRPQVROUCAiKTsKKwlpZiAocyAmIFNDU0lSU1RPKQorCQlTUFJJTlRGKCJTQ1NJUlNUTyAiKTsKKwlTUFJJTlRGKCIpOyIpOworCisJU1BSSU5URigiIFNDU0lTSUcoIik7CisJcyA9IEdFVFBPUlQoU0NTSVNJRyk7CisJc3dpdGNoIChzICYgUF9NQVNLKSB7CisJY2FzZSBQX0RBVEFPOgorCQlTUFJJTlRGKCJEQVRBIE9VVCIpOworCQlicmVhazsKKwljYXNlIFBfREFUQUk6CisJCVNQUklOVEYoIkRBVEEgSU4iKTsKKwkJYnJlYWs7CisJY2FzZSBQX0NNRDoKKwkJU1BSSU5URigiQ09NTUFORCIpOworCQlicmVhazsKKwljYXNlIFBfU1RBVFVTOgorCQlTUFJJTlRGKCJTVEFUVVMiKTsKKwkJYnJlYWs7CisJY2FzZSBQX01TR086CisJCVNQUklOVEYoIk1FU1NBR0UgT1VUIik7CisJCWJyZWFrOworCWNhc2UgUF9NU0dJOgorCQlTUFJJTlRGKCJNRVNTQUdFIElOIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVNQUklOVEYoIippbnZhbGlkKiIpOworCQlicmVhazsKKwl9CisKKwlTUFJJTlRGKCIpOyAiKTsKKworCVNQUklOVEYoIklOVFNUQVQgKCVzKTsgIiwgVEVTVEhJKERNQVNUQVQsIElOVFNUQVQpID8gImhpIiA6ICJsbyIpOworCisJU1BSSU5URigiU1NUQVQoICIpOworCXMgPSBHRVRQT1JUKFNTVEFUMCk7CisJaWYgKHMgJiBUQVJHRVQpCisJCVNQUklOVEYoIlRBUkdFVCAiKTsKKwlpZiAocyAmIFNFTERPKQorCQlTUFJJTlRGKCJTRUxETyAiKTsKKwlpZiAocyAmIFNFTERJKQorCQlTUFJJTlRGKCJTRUxESSAiKTsKKwlpZiAocyAmIFNFTElOR08pCisJCVNQUklOVEYoIlNFTElOR08gIik7CisJaWYgKHMgJiBTV1JBUCkKKwkJU1BSSU5URigiU1dSQVAgIik7CisJaWYgKHMgJiBTRE9ORSkKKwkJU1BSSU5URigiU0RPTkUgIik7CisJaWYgKHMgJiBTUElPUkRZKQorCQlTUFJJTlRGKCJTUElPUkRZICIpOworCWlmIChzICYgRE1BRE9ORSkKKwkJU1BSSU5URigiRE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMSk7CisJaWYgKHMgJiBTRUxUTykKKwkJU1BSSU5URigiU0VMVE8gIik7CisJaWYgKHMgJiBBVE5UQVJHKQorCQlTUFJJTlRGKCJBVE5UQVJHICIpOworCWlmIChzICYgU0NTSVJTVEkpCisJCVNQUklOVEYoIlNDU0lSU1RJICIpOworCWlmIChzICYgUEhBU0VNSVMpCisJCVNQUklOVEYoIlBIQVNFTUlTICIpOworCWlmIChzICYgQlVTRlJFRSkKKwkJU1BSSU5URigiQlVTRlJFRSAiKTsKKwlpZiAocyAmIFNDU0lQRVJSKQorCQlTUFJJTlRGKCJTQ1NJUEVSUiAiKTsKKwlpZiAocyAmIFBIQVNFQ0hHKQorCQlTUFJJTlRGKCJQSEFTRUNIRyAiKTsKKwlpZiAocyAmIFJFUUlOSVQpCisJCVNQUklOVEYoIlJFUUlOSVQgIik7CisJU1BSSU5URigiKTsgIik7CisKKworCVNQUklOVEYoIlNTVEFUKCAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMCkgJiBHRVRQT1JUKFNJTU9ERTApOworCisJaWYgKHMgJiBUQVJHRVQpCisJCVNQUklOVEYoIlRBUkdFVCAiKTsKKwlpZiAocyAmIFNFTERPKQorCQlTUFJJTlRGKCJTRUxETyAiKTsKKwlpZiAocyAmIFNFTERJKQorCQlTUFJJTlRGKCJTRUxESSAiKTsKKwlpZiAocyAmIFNFTElOR08pCisJCVNQUklOVEYoIlNFTElOR08gIik7CisJaWYgKHMgJiBTV1JBUCkKKwkJU1BSSU5URigiU1dSQVAgIik7CisJaWYgKHMgJiBTRE9ORSkKKwkJU1BSSU5URigiU0RPTkUgIik7CisJaWYgKHMgJiBTUElPUkRZKQorCQlTUFJJTlRGKCJTUElPUkRZICIpOworCWlmIChzICYgRE1BRE9ORSkKKwkJU1BSSU5URigiRE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNTVEFUMSkgJiBHRVRQT1JUKFNJTU9ERTEpOworCisJaWYgKHMgJiBTRUxUTykKKwkJU1BSSU5URigiU0VMVE8gIik7CisJaWYgKHMgJiBBVE5UQVJHKQorCQlTUFJJTlRGKCJBVE5UQVJHICIpOworCWlmIChzICYgU0NTSVJTVEkpCisJCVNQUklOVEYoIlNDU0lSU1RJICIpOworCWlmIChzICYgUEhBU0VNSVMpCisJCVNQUklOVEYoIlBIQVNFTUlTICIpOworCWlmIChzICYgQlVTRlJFRSkKKwkJU1BSSU5URigiQlVTRlJFRSAiKTsKKwlpZiAocyAmIFNDU0lQRVJSKQorCQlTUFJJTlRGKCJTQ1NJUEVSUiAiKTsKKwlpZiAocyAmIFBIQVNFQ0hHKQorCQlTUFJJTlRGKCJQSEFTRUNIRyAiKTsKKwlpZiAocyAmIFJFUUlOSVQpCisJCVNQUklOVEYoIlJFUUlOSVQgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJTWEZSQ1RMMCggIik7CisKKwlzID0gR0VUUE9SVChTWEZSQ1RMMCk7CisJaWYgKHMgJiBTQ1NJRU4pCisJCVNQUklOVEYoIlNDU0lFTiAiKTsKKwlpZiAocyAmIERNQUVOKQorCQlTUFJJTlRGKCJETUFFTiAiKTsKKwlpZiAocyAmIENIMSkKKwkJU1BSSU5URigiQ0gxICIpOworCWlmIChzICYgQ0xSU1RDTlQpCisJCVNQUklOVEYoIkNMUlNUQ05UICIpOworCWlmIChzICYgU1BJT0VOKQorCQlTUFJJTlRGKCJTUElPRU4gIik7CisJaWYgKHMgJiBDTFJDSDEpCisJCVNQUklOVEYoIkNMUkNIMSAiKTsKKwlTUFJJTlRGKCIpOyAiKTsKKworCVNQUklOVEYoIlNJR05BTCggIik7CisKKwlzID0gR0VUUE9SVChTQ1NJU0lHKTsKKwlpZiAocyAmIFNJR19BVE5JKQorCQlTUFJJTlRGKCJBVE5JICIpOworCWlmIChzICYgU0lHX1NFTEkpCisJCVNQUklOVEYoIlNFTEkgIik7CisJaWYgKHMgJiBTSUdfQlNZSSkKKwkJU1BSSU5URigiQlNZSSAiKTsKKwlpZiAocyAmIFNJR19SRVFJKQorCQlTUFJJTlRGKCJSRVFJICIpOworCWlmIChzICYgU0lHX0FDS0kpCisJCVNQUklOVEYoIkFDS0kgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJTRUxJRCglMDJ4KSwgIiwgR0VUUE9SVChTRUxJRCkpOworCisJU1BSSU5URigiU1RDTlQoJWQpLCAiLCBHRVRTVENOVCgpKTsKKworCVNQUklOVEYoIlNTVEFUMiggIik7CisKKwlzID0gR0VUUE9SVChTU1RBVDIpOworCWlmIChzICYgU09GRlNFVCkKKwkJU1BSSU5URigiU09GRlNFVCAiKTsKKwlpZiAocyAmIFNFTVBUWSkKKwkJU1BSSU5URigiU0VNUFRZICIpOworCWlmIChzICYgU0ZVTEwpCisJCVNQUklOVEYoIlNGVUxMICIpOworCVNQUklOVEYoIik7IFNGQ05UICglZCk7ICIsIHMgJiAoU0ZVTEwgfCBTRkNOVCkpOworCisJcyA9IEdFVFBPUlQoU1NUQVQzKTsKKwlTUFJJTlRGKCJTQ1NJQ05UICglZCksIE9GRkNOVCglZCksICIsIChzICYgMHhmMCkgPj4gNCwgcyAmIDB4MGYpOworCisJU1BSSU5URigiU1NUQVQ0KCAiKTsKKwlzID0gR0VUUE9SVChTU1RBVDQpOworCWlmIChzICYgU1lOQ0VSUikKKwkJU1BSSU5URigiU1lOQ0VSUiAiKTsKKwlpZiAocyAmIEZXRVJSKQorCQlTUFJJTlRGKCJGV0VSUiAiKTsKKwlpZiAocyAmIEZSRVJSKQorCQlTUFJJTlRGKCJGUkVSUiAiKTsKKwlTUFJJTlRGKCIpOyAiKTsKKworCVNQUklOVEYoIkRNQUNOVFJMMCggIik7CisJcyA9IEdFVFBPUlQoRE1BQ05UUkwwKTsKKwlTUFJJTlRGKCIlcyAiLCBzICYgXzhCSVQgPyAiOEJJVCIgOiAiMTZCSVQiKTsKKwlTUFJJTlRGKCIlcyAiLCBzICYgRE1BID8gIkRNQSIgOiAiUElPIik7CisJU1BSSU5URigiJXMgIiwgcyAmIFdSSVRFX1JFQUQgPyAiV1JJVEUiIDogIlJFQUQiKTsKKwlpZiAocyAmIEVORE1BKQorCQlTUFJJTlRGKCJFTkRNQSAiKTsKKwlpZiAocyAmIElOVEVOKQorCQlTUFJJTlRGKCJJTlRFTiAiKTsKKwlpZiAocyAmIFJTVEZJRk8pCisJCVNQUklOVEYoIlJTVEZJRk8gIik7CisJaWYgKHMgJiBTV0lOVCkKKwkJU1BSSU5URigiU1dJTlQgIik7CisJU1BSSU5URigiKTsgIik7CisKKwlTUFJJTlRGKCJETUFTVEFUKCAiKTsKKwlzID0gR0VUUE9SVChETUFTVEFUKTsKKwlpZiAocyAmIEFURE9ORSkKKwkJU1BSSU5URigiQVRET05FICIpOworCWlmIChzICYgV09SRFJEWSkKKwkJU1BSSU5URigiV09SRFJEWSAiKTsKKwlpZiAocyAmIERGSUZPRlVMTCkKKwkJU1BSSU5URigiREZJRk9GVUxMICIpOworCWlmIChzICYgREZJRk9FTVApCisJCVNQUklOVEYoIkRGSUZPRU1QICIpOworCVNQUklOVEYoIilcbiIpOworCisJU1BSSU5URigiZW5hYmxlZCBpbnRlcnJ1cHRzKCAiKTsKKworCXMgPSBHRVRQT1JUKFNJTU9ERTApOworCWlmIChzICYgRU5TRUxETykKKwkJU1BSSU5URigiRU5TRUxETyAiKTsKKwlpZiAocyAmIEVOU0VMREkpCisJCVNQUklOVEYoIkVOU0VMREkgIik7CisJaWYgKHMgJiBFTlNFTElOR08pCisJCVNQUklOVEYoIkVOU0VMSU5HTyAiKTsKKwlpZiAocyAmIEVOU1dSQVApCisJCVNQUklOVEYoIkVOU1dSQVAgIik7CisJaWYgKHMgJiBFTlNET05FKQorCQlTUFJJTlRGKCJFTlNET05FICIpOworCWlmIChzICYgRU5TUElPUkRZKQorCQlTUFJJTlRGKCJFTlNQSU9SRFkgIik7CisJaWYgKHMgJiBFTkRNQURPTkUpCisJCVNQUklOVEYoIkVORE1BRE9ORSAiKTsKKworCXMgPSBHRVRQT1JUKFNJTU9ERTEpOworCWlmIChzICYgRU5TRUxUSU1PKQorCQlTUFJJTlRGKCJFTlNFTFRJTU8gIik7CisJaWYgKHMgJiBFTkFUTlRBUkcpCisJCVNQUklOVEYoIkVOQVROVEFSRyAiKTsKKwlpZiAocyAmIEVOUEhBU0VNSVMpCisJCVNQUklOVEYoIkVOUEhBU0VNSVMgIik7CisJaWYgKHMgJiBFTkJVU0ZSRUUpCisJCVNQUklOVEYoIkVOQlVTRlJFRSAiKTsKKwlpZiAocyAmIEVOU0NTSVBFUlIpCisJCVNQUklOVEYoIkVOU0NTSVBFUlIgIik7CisJaWYgKHMgJiBFTlBIQVNFQ0hHKQorCQlTUFJJTlRGKCJFTlBIQVNFQ0hHICIpOworCWlmIChzICYgRU5SRVFJTklUKQorCQlTUFJJTlRGKCJFTlJFUUlOSVQgIik7CisJU1BSSU5URigiKVxuIik7CisKKwlyZXR1cm4gKHBvcyAtIHN0YXJ0KTsKK30KKworc3RhdGljIGludCBhaGExNTJ4X3NldF9pbmZvKGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCwgc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpCit7CisJaWYoIXNocG50IHx8ICFidWZmZXIgfHwgbGVuZ3RoPDggfHwgc3RybmNtcCgiYWhhMTUyeCAiLCBidWZmZXIsIDgpIT0wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpZihsZW5ndGg+MTQgJiYgc3RybmNtcCgiZGVidWcgIiwgYnVmZmVyKzgsIDYpPT0wKSB7CisJCWludCBkZWJ1ZyA9IEhPU1REQVRBKHNocG50KS0+ZGVidWc7CisKKwkJSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlcisxNCwgTlVMTCwgMCk7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWhhMTUyeCVkOiBkZWJ1Z2dpbmcgb3B0aW9ucyBzZXQgdG8gMHglMDR4ICh3ZXJlIDB4JTA0eClcbiIsIEhPU1ROTywgSE9TVERBVEEoc2hwbnQpLT5kZWJ1ZywgZGVidWcpOworCX0gZWxzZQorI2VuZGlmCisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJaWYobGVuZ3RoPjEzICYmIHN0cm5jbXAoInJlc2V0IiwgYnVmZmVyKzgsIDUpPT0wKSB7CisJCWludCBpOworCisJCUhPU1REQVRBKHNocG50KS0+dG90YWxfY29tbWFuZHM9MDsKKwkJSE9TVERBVEEoc2hwbnQpLT5kaXNjb25uZWN0aW9ucz0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9hbnlfYWN0aW9uPTA7CisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X29sZF9jb21tYW5kPTA7CisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X25ld19jb21tYW5kPTA7CisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X2RvbmVfY29tbWFuZD0wOworCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb249MDsKKwkJZm9yIChpID0gaWRsZTsgaTxtYXhzdGF0ZTsgaSsrKSB7CisJCQlIT1NUREFUQShzaHBudCktPmNvdW50W2ldPTA7CisJCQlIT1NUREFUQShzaHBudCktPmNvdW50X3RyYW5zW2ldPTA7CisJCQlIT1NUREFUQShzaHBudCktPnRpbWVbaV09MDsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gImFoYTE1MnglZDogc3RhdHMgcmVzZXRlZC5cbiIsIEhPU1ROTyk7CisKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisKKwlyZXR1cm4gbGVuZ3RoOworfQorCisjdW5kZWYgU1BSSU5URgorI2RlZmluZSBTUFJJTlRGKGFyZ3MuLi4pIFwKKwlkbyB7IGlmKHBvcyA8IGJ1ZmZlciArIGxlbmd0aCkgcG9zICs9IHNwcmludGYocG9zLCAjIyBhcmdzKTsgfSB3aGlsZSgwKQorCitzdGF0aWMgaW50IGFoYTE1MnhfcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5vdXQpCit7CisJaW50IGk7CisJY2hhciAqcG9zID0gYnVmZmVyOworCVNjc2lfQ21uZCAqcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRoaXNsZW5ndGg7CisKKwlEUFJJTlRLKGRlYnVnX3Byb2NpbmZvLCAKKwkgICAgICAgS0VSTl9ERUJVRyAiYWhhMTUyeF9wcm9jX2luZm86IGJ1ZmZlcj0lcCBvZmZzZXQ9JWxkIGxlbmd0aD0lZCBob3N0bm89JWQgaW5vdXQ9JWRcbiIsCisJICAgICAgIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHNocG50LT5ob3N0X25vLCBpbm91dCk7CisKKworCWlmIChpbm91dCkKKwkJcmV0dXJuIGFoYTE1Mnhfc2V0X2luZm8oYnVmZmVyLCBsZW5ndGgsIHNocG50KTsKKworCVNQUklOVEYoQUhBMTUyWF9SRVZJRCAiXG4iKTsKKworCVNQUklOVEYoImlvcG9ydHMgMHglMDRseCB0byAweCUwNGx4XG4iLAorCQlzaHBudC0+aW9fcG9ydCwgc2hwbnQtPmlvX3BvcnQgKyBzaHBudC0+bl9pb19wb3J0IC0gMSk7CisJU1BSSU5URigiaW50ZXJydXB0IDB4JTAyeFxuIiwgc2hwbnQtPmlycSk7CisJU1BSSU5URigiZGlzY29ubmVjdGlvbi9yZWNvbm5lY3Rpb24gJXNcbiIsCisJCVJFQ09OTkVDVCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCVNQUklOVEYoInBhcml0eSBjaGVja2luZyAlc1xuIiwKKwkJUEFSSVRZID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJU1BSSU5URigic3luY2hyb25vdXMgdHJhbnNmZXJzICVzXG4iLAorCQlTWU5DSFJPTk9VUyA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCVNQUklOVEYoIiVkIGNvbW1hbmRzIGN1cnJlbnRseSBxdWV1ZWRcbiIsIEhPU1REQVRBKHNocG50KS0+Y29tbWFuZHMpOworCisJaWYoU1lOQ0hST05PVVMpIHsKKwkJU1BSSU5URigic3luY2hyb25vdXNseSBvcGVyYXRpbmcgdGFyZ2V0cyAodGljaz01MCBucyk6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWlmIChIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldICYgMHg3ZikKKwkJCQlTUFJJTlRGKCJ0YXJnZXQgJWQ6IHBlcmlvZCAlZFQvJWRuczsgcmVxL2FjayBvZmZzZXQgJWRcbiIsCisJCQkJCWksCisJCQkJCSgoKEhPU1REQVRBKHNocG50KS0+c3luY3JhdGVbaV0gJiAweDcwKSA+PiA0KSArIDIpLAorCQkJCQkoKChIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldICYgMHg3MCkgPj4gNCkgKyAyKSAqIDUwLAorCQkJCSAgICBIT1NUREFUQShzaHBudCktPnN5bmNyYXRlW2ldICYgMHgwZik7CisJfQorI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKyNkZWZpbmUgUERFQlVHKGZsYWdzLHR4dCkgXAorCWlmKEhPU1REQVRBKHNocG50KS0+ZGVidWcgJiBmbGFncykgU1BSSU5URigiKCVzKSAiLCB0eHQpOworCisJU1BSSU5URigiZW5hYmxlZCBkZWJ1Z2dpbmcgb3B0aW9uczogIik7CisKKwlQREVCVUcoZGVidWdfcHJvY2luZm8sICJwcm9jaW5mbyIpOworCVBERUJVRyhkZWJ1Z19xdWV1ZSwgInF1ZXVlIik7CisJUERFQlVHKGRlYnVnX2ludHIsICJpbnRlcnJ1cHQiKTsKKwlQREVCVUcoZGVidWdfc2VsZWN0aW9uLCAic2VsZWN0aW9uIik7CisJUERFQlVHKGRlYnVnX21zZ28sICJtZXNzYWdlIG91dCIpOworCVBERUJVRyhkZWJ1Z19tc2dpLCAibWVzc2FnZSBpbiIpOworCVBERUJVRyhkZWJ1Z19zdGF0dXMsICJzdGF0dXMiKTsKKwlQREVCVUcoZGVidWdfY21kLCAiY29tbWFuZCIpOworCVBERUJVRyhkZWJ1Z19kYXRhaSwgImRhdGEgaW4iKTsKKwlQREVCVUcoZGVidWdfZGF0YW8sICJkYXRhIG91dCIpOworCVBERUJVRyhkZWJ1Z19laCwgImVoIik7CisJUERFQlVHKGRlYnVnX2xvY2tzLCAibG9ja3MiKTsKKwlQREVCVUcoZGVidWdfcGhhc2VzLCAicGhhc2VzIik7CisKKwlTUFJJTlRGKCJcbiIpOworI2VuZGlmCisKKwlTUFJJTlRGKCJcbnF1ZXVlIHN0YXR1czpcbiIpOworCURPX0xPQ0soZmxhZ3MpOworCWlmIChJU1NVRV9TQykgeworCQlTUFJJTlRGKCJub3QgeWV0IGlzc3VlZCBjb21tYW5kczpcbiIpOworCQlmb3IgKHB0ciA9IElTU1VFX1NDOyBwdHI7IHB0ciA9IFNDTkVYVChwdHIpKQorCQkJcG9zICs9IGdldF9jb21tYW5kKHBvcywgcHRyKTsKKwl9IGVsc2UKKwkJU1BSSU5URigibm8gbm90IHlldCBpc3N1ZWQgY29tbWFuZHNcbiIpOworCURPX1VOTE9DSyhmbGFncyk7CisKKwlpZiAoQ1VSUkVOVF9TQykgeworCQlTUFJJTlRGKCJjdXJyZW50IGNvbW1hbmQ6XG4iKTsKKwkJcG9zICs9IGdldF9jb21tYW5kKHBvcywgQ1VSUkVOVF9TQyk7CisJfSBlbHNlCisJCVNQUklOVEYoIm5vIGN1cnJlbnQgY29tbWFuZFxuIik7CisKKwlpZiAoRElTQ09OTkVDVEVEX1NDKSB7CisJCVNQUklOVEYoImRpc2Nvbm5lY3RlZCBjb21tYW5kczpcbiIpOworCQlmb3IgKHB0ciA9IERJU0NPTk5FQ1RFRF9TQzsgcHRyOyBwdHIgPSBTQ05FWFQocHRyKSkKKwkJCXBvcyArPSBnZXRfY29tbWFuZChwb3MsIHB0cik7CisJfSBlbHNlCisJCVNQUklOVEYoIm5vIGRpc2Nvbm5lY3RlZCBjb21tYW5kc1xuIik7CisKKwlwb3MgKz0gZ2V0X3BvcnRzKHNocG50LCBwb3MpOworCisjaWYgZGVmaW5lZChBSEExNTJYX1NUQVQpCisJU1BSSU5URigic3RhdGlzdGljczpcbiIKKwkgICAgICAgICJ0b3RhbCBjb21tYW5kczogICAgICAgICAgICAgICAlZFxuIgorCSAgICAgICAgImRpc2Nvbm5lY3Rpb25zOiAgICAgICAgICAgICAgICVkXG4iCisJCSJidXNmcmVlIHdpdGggY2hlY2sgY29uZGl0aW9uOiAlZFxuIgorCQkiYnVzZnJlZSB3aXRob3V0IG9sZCBjb21tYW5kOiAgJWRcbiIKKwkJImJ1c2ZyZWUgd2l0aG91dCBuZXcgY29tbWFuZDogICVkXG4iCisJCSJidXNmcmVlIHdpdGhvdXQgZG9uZSBjb21tYW5kOiAlZFxuIgorCQkiYnVzZnJlZSB3aXRob3V0IGFueSBhY3Rpb246ICAgJWRcbiIKKwkJInN0YXRlICAgICAgIgorCQkidHJhbnNpdGlvbnMgICIKKwkJImNvdW50ICAgICAgICAiCisJCSJ0aW1lXG4iLAorCQlIT1NUREFUQShzaHBudCktPnRvdGFsX2NvbW1hbmRzLAorCQlIT1NUREFUQShzaHBudCktPmRpc2Nvbm5lY3Rpb25zLAorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aF9jaGVja19jb25kaXRpb24sCisJCUhPU1REQVRBKHNocG50KS0+YnVzZnJlZV93aXRob3V0X29sZF9jb21tYW5kLAorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9uZXdfY29tbWFuZCwKKwkJSE9TVERBVEEoc2hwbnQpLT5idXNmcmVlX3dpdGhvdXRfZG9uZV9jb21tYW5kLAorCQlIT1NUREFUQShzaHBudCktPmJ1c2ZyZWVfd2l0aG91dF9hbnlfYWN0aW9uKTsKKwlmb3IoaT0wOyBpPG1heHN0YXRlOyBpKyspIHsKKwkJU1BSSU5URigiJS0xMHMgJS0xMmQgJS0xMmQgJS0xMmxkXG4iLAorCQkgICAgICAgIHN0YXRlc1tpXS5uYW1lLAorCQkJSE9TVERBVEEoc2hwbnQpLT5jb3VudF90cmFuc1tpXSwKKwkJCUhPU1REQVRBKHNocG50KS0+Y291bnRbaV0sCisJCQlIT1NUREFUQShzaHBudCktPnRpbWVbaV0pOworCX0KKyNlbmRpZgorCisJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgS0VSTl9ERUJVRyAiYWhhMTUyeF9wcm9jX2luZm86IHBvcz0lcFxuIiwgcG9zKTsKKworCXRoaXNsZW5ndGggPSBwb3MgLSAoYnVmZmVyICsgb2Zmc2V0KTsKKwlEUFJJTlRLKGRlYnVnX3Byb2NpbmZvLCBLRVJOX0RFQlVHICJhaGExNTJ4X3Byb2NfaW5mbzogbGVuZ3RoPSVkIHRoaXNsZW5ndGg9JWRcbiIsIGxlbmd0aCwgdGhpc2xlbmd0aCk7CisKKwlpZih0aGlzbGVuZ3RoPDApIHsKKwkJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgS0VSTl9ERUJVRyAiYWhhMTUyeF9wcm9jX2luZm86IG91dHB1dCB0b28gc2hvcnRcbiIpOworCQkqc3RhcnQgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aGlzbGVuZ3RoID0gdGhpc2xlbmd0aDxsZW5ndGggPyB0aGlzbGVuZ3RoIDogbGVuZ3RoOworCisJRFBSSU5USyhkZWJ1Z19wcm9jaW5mbywgS0VSTl9ERUJVRyAiYWhhMTUyeF9wcm9jX2luZm86IHJldHVybiAlZFxuIiwgdGhpc2xlbmd0aCk7CisKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJcmV0dXJuIHRoaXNsZW5ndGggPCBsZW5ndGggPyB0aGlzbGVuZ3RoIDogbGVuZ3RoOworfQorCitzdGF0aWMgU2NzaV9Ib3N0X1RlbXBsYXRlIGFoYTE1MnhfZHJpdmVyX3RlbXBsYXRlID0geworCS5tb2R1bGUJCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCQk9IEFIQTE1MlhfUkVWSUQsCisJLnByb2NfbmFtZQkJCT0gImFoYTE1MngiLAorCS5wcm9jX2luZm8JCQk9IGFoYTE1MnhfcHJvY19pbmZvLAorCS5xdWV1ZWNvbW1hbmQJCQk9IGFoYTE1MnhfcXVldWUsCisJLmVoX2Fib3J0X2hhbmRsZXIJCT0gYWhhMTUyeF9hYm9ydCwKKwkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIJPSBhaGExNTJ4X2RldmljZV9yZXNldCwKKwkuZWhfYnVzX3Jlc2V0X2hhbmRsZXIJCT0gYWhhMTUyeF9idXNfcmVzZXQsCisJLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgkJPSBhaGExNTJ4X2hvc3RfcmVzZXQsCisJLmJpb3NfcGFyYW0JCQk9IGFoYTE1MnhfYmlvc3BhcmFtLAorCS5jYW5fcXVldWUJCQk9IDEsCisJLnRoaXNfaWQJCQk9IDcsCisJLnNnX3RhYmxlc2l6ZQkJCT0gU0dfQUxMLAorCS5jbWRfcGVyX2x1bgkJCT0gMSwKKwkudXNlX2NsdXN0ZXJpbmcJCQk9IERJU0FCTEVfQ0xVU1RFUklORywKK307CisKKyNpZiAhZGVmaW5lZChQQ01DSUEpCitzdGF0aWMgaW50IHNldHVwX2NvdW50Oworc3RhdGljIHN0cnVjdCBhaGExNTJ4X3NldHVwIHNldHVwWzJdOworCisvKiBwb3NzaWJsZSBpL28gYWRkcmVzc2VzIGZvciB0aGUgQUlDLTYyNjA7IGRlZmF1bHQgZmlyc3QgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwb3J0c1tdID0geyAweDM0MCwgMHgxNDAgfTsKKworI2lmICFkZWZpbmVkKFNLSVBfQklPU1RFU1QpCisvKiBwb3NzaWJsZSBsb2NhdGlvbnMgZm9yIHRoZSBBZGFwdGVjIEJJT1M7IGRlZmF1bHRzIGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGFkZHJlc3Nlc1tdID0KK3sKKwkweGRjMDAwLAkJLyogZGVmYXVsdCBmaXJzdCAqLworCTB4YzgwMDAsCisJMHhjYzAwMCwKKwkweGQwMDAwLAorCTB4ZDQwMDAsCisJMHhkODAwMCwKKwkweGUwMDAwLAorCTB4ZWI4MDAsCQkvKiBWVGVjaCBQbGF0aW51bSBTTVAgKi8KKwkweGYwMDAwLAorfTsKKworLyogc2lnbmF0dXJlcyBmb3IgdmFyaW91cyBBSUMtNlsyM102MCBiYXNlZCBjb250cm9sbGVycy4KKyAgIFRoZSBwb2ludCBpbiBkZXRlY3Rpbmcgc2lnbmF0dXJlcyBpcyB0byBhdm9pZCB1c2VsZXNzIGFuZCBtYXliZQorICAgaGFybWZ1bCBwcm9iZXMgb24gcG9ydHMuIEknbSBub3Qgc3VyZSB0aGF0IGFsbCBsaXN0ZWQgYm9hcmRzIHBhc3MKKyAgIGF1dG8tY29uZmlndXJhdGlvbi4gRm9yIHRob3NlIHdoaWNoIGZhaWwgdGhlIEJJT1Mgc2lnbmF0dXJlIGlzCisgICBvYnNvbGV0ZSwgYmVjYXVzZSB1c2VyIGludGVydmVudGlvbiB0byBzdXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gaXMKKyAgIG5lZWRlZCBhbnl3YXkuICBNYXkgYmUgYW4gaW5mb3JtYXRpb24gd2hldGhlciBvciBub3QgdGhlIEJJT1Mgc3VwcG9ydHMKKyAgIGV4dGVuZGVkIHRyYW5zbGF0aW9uIGNvdWxkIGJlIGFsc28gdXNlZnVsIGhlcmUuICovCitzdGF0aWMgc3RydWN0IHNpZ25hdHVyZSB7CisJdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlOworCWludCBzaWdfb2Zmc2V0OworCWludCBzaWdfbGVuZ3RoOworfSBzaWduYXR1cmVzW10gPQoreworCXsgIkFkYXB0ZWMgQUhBLTE1MjAgQklPUyIsCTB4MTAyZSwgMjEgfSwKKwkJLyogQWRhcHRlYyAxNTJ4ICovCisJeyAiQWRhcHRlYyBBSEEtMTUyMEIiLAkJMHgwMDBiLCAxNyB9LAorCQkvKiBBZGFwdGVjIDE1MnggcmV2IEIgKi8KKwl7ICJBZGFwdGVjIEFIQS0xNTIwQiIsCQkweDAwMjYsIDE3IH0sCisJCS8qIElvbWVnYSBKYXogSmV0IElTQSAoQUlDNjM3MFEpICovCisJeyAiQWRhcHRlYyBBU1ctQjYyNiBCSU9TIiwJMHgxMDI5LCAyMSB9LAorCQkvKiBvbi1ib2FyZCBjb250cm9sbGVyICovCisJeyAiQWRhcHRlYyBCSU9TOiBBU1ctQjYyNiIsCTB4MDAwZiwgMjIgfSwKKwkJLyogb24tYm9hcmQgY29udHJvbGxlciAqLworCXsgIkFkYXB0ZWMgQVNXLUI2MjYgUzIiLAkweDJlNmMsIDE5IH0sCisJCS8qIG9uLWJvYXJkIGNvbnRyb2xsZXIgKi8KKwl7ICJBZGFwdGVjIEJJT1M6QUlDLTYzNjAiLAkweDAwMGMsIDIxIH0sCisJCS8qIG9uLWJvYXJkIGNvbnRyb2xsZXIgKi8KKwl7ICJTY3NpUHJvIFNQLTM2MCBCSU9TIiwJMHgyODczLCAxOSB9LAorCQkvKiBTY3NpUHJvLUNvbnRyb2xsZXIgICovCisJeyAiR0EtNDAwIExPQ0FMIEJVUyBTQ1NJIEJJT1MiLCAweDEwMmUsIDI2IH0sCisJCS8qIEdpZ2FieXRlIExvY2FsLUJ1cy1TQ1NJICovCisJeyAiQWRhcHRlYyBCSU9TOkFWQS0yODJYIiwJMHgwMDBjLCAyMSB9LAorCQkvKiBBZGFwdGVjIDI4MnggKi8KKwl7ICJBZGFwdGVjIElCTSBEb2NrIElJIFNDU0kiLCAgIDB4MmVkZCwgMjQgfSwKKwkJLyogSUJNIFRoaW5rcGFkIERvY2sgSUkgKi8KKwl7ICJBZGFwdGVjIEJJT1M6QUhBLTE1MzJQIiwgICAgIDB4MDAxYywgMjIgfSwKKwkJLyogSUJNIFRoaW5rcGFkIERvY2sgSUkgU0NTSSAqLworCXsgIkRUQzM1MjBBIEhvc3QgQWRhcHRlciBCSU9TIiwgMHgzMThhLCAyNiB9LAorCQkvKiBEVEMgMzUyMEEgSVNBIFNDU0kgKi8KK307CisjZW5kaWYgLyogIVNLSVBfQklPU1RFU1QgKi8KKworLyoKKyAqIFRlc3QsIGlmIHBvcnRfYmFzZSBpcyB2YWxpZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgYWhhMTUyeF9wb3J0dGVzdChpbnQgaW9fcG9ydCkKK3sKKwlpbnQgaTsKKworCVNFVFBPUlQoaW9fcG9ydCArIE9fRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlTRVRQT1JUKGlvX3BvcnQgKyBPX1NUQUNLLCBpKTsKKworCVNFVFBPUlQoaW9fcG9ydCArIE9fRE1BQ05UUkwxLCAwKTsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLworCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBHRVRQT1JUKGlvX3BvcnQgKyBPX1NUQUNLKSA9PSBpOyBpKyspCisJCTsKKworCXJldHVybiAoaSA9PSAxNik7Cit9CisKK3N0YXRpYyBpbnQgdGMxNTUwX3BvcnR0ZXN0KGludCBpb19wb3J0KQoreworCWludCBpOworCisJU0VUUE9SVChpb19wb3J0ICsgT19UQ19ETUFDTlRSTDEsIDApOwkvKiByZXNldCBzdGFjayBwb2ludGVyICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCVNFVFBPUlQoaW9fcG9ydCArIE9fU1RBQ0ssIGkpOworCisJU0VUUE9SVChpb19wb3J0ICsgT19UQ19ETUFDTlRSTDEsIDApOwkvKiByZXNldCBzdGFjayBwb2ludGVyICovCisJZm9yIChpID0gMDsgaSA8IDE2ICYmIEdFVFBPUlQoaW9fcG9ydCArIE9fVENfU1RBQ0spID09IGk7IGkrKykKKwkJOworCisJcmV0dXJuIChpID09IDE2KTsKK30KKworCitzdGF0aWMgaW50IGNoZWNrc2V0dXAoc3RydWN0IGFoYTE1Mnhfc2V0dXAgKnNldHVwKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRzKSAmJiAoc2V0dXAtPmlvX3BvcnQgIT0gcG9ydHNbaV0pOyBpKyspCisJCTsKKworCWlmIChpID09IEFSUkFZX1NJWkUocG9ydHMpKQorCQlyZXR1cm4gMDsKKworCWlmICggcmVxdWVzdF9yZWdpb24oc2V0dXAtPmlvX3BvcnQsIElPX1JBTkdFLCAiYWhhMTUyeCIpPT0wICkgeworCQlwcmludGsoS0VSTl9FUlIgImFoYTE1Mng6IGlvIHBvcnQgMHgleCBidXN5LlxuIiwgc2V0dXAtPmlvX3BvcnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiggYWhhMTUyeF9wb3J0dGVzdChzZXR1cC0+aW9fcG9ydCkgKSB7CisJCXNldHVwLT50YzE1NTA9MDsKKwl9IGVsc2UgaWYoIHRjMTU1MF9wb3J0dGVzdChzZXR1cC0+aW9fcG9ydCkgKSB7CisJCXNldHVwLT50YzE1NTA9MTsKKwl9IGVsc2UgeworCQlyZWxlYXNlX3JlZ2lvbihzZXR1cC0+aW9fcG9ydCwgSU9fUkFOR0UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZWxlYXNlX3JlZ2lvbihzZXR1cC0+aW9fcG9ydCwgSU9fUkFOR0UpOworCisJaWYgKChzZXR1cC0+aXJxIDwgSVJRX01JTikgfHwgKHNldHVwLT5pcnEgPiBJUlFfTUFYKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHNldHVwLT5zY3NpaWQgPCAwKSB8fCAoc2V0dXAtPnNjc2lpZCA+IDcpKQorCQlyZXR1cm4gMDsKKworCWlmICgoc2V0dXAtPnJlY29ubmVjdCA8IDApIHx8IChzZXR1cC0+cmVjb25uZWN0ID4gMSkpCisJCXJldHVybiAwOworCisJaWYgKChzZXR1cC0+cGFyaXR5IDwgMCkgfHwgKHNldHVwLT5wYXJpdHkgPiAxKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHNldHVwLT5zeW5jaHJvbm91cyA8IDApIHx8IChzZXR1cC0+c3luY2hyb25vdXMgPiAxKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHNldHVwLT5leHRfdHJhbnMgPCAwKSB8fCAoc2V0dXAtPmV4dF90cmFucyA+IDEpKQorCQlyZXR1cm4gMDsKKworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYWhhMTUyeF9pbml0KHZvaWQpCit7CisJaW50IGksIGosIG9rOworI2lmIGRlZmluZWQoQVVUT0NPTkYpCisJYWhhMTUyeF9jb25maWcgY29uZjsKKyNlbmRpZgorI2lmZGVmIF9fSVNBUE5QX18KKwlzdHJ1Y3QgcG5wX2RldiAqZGV2PU5VTEwsICpwbnBkZXZbMl0gPSB7TlVMTCwgTlVMTH07CisjZW5kaWYKKworCWlmICggc2V0dXBfY291bnQgKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFoYTE1Mng6IHByb2Nlc3NpbmcgY29tbWFuZGxpbmU6ICIpOworCisJCWZvciAoaSA9IDA7IGk8c2V0dXBfY291bnQ7IGkrKykgeworCQkJaWYgKCFjaGVja3NldHVwKCZzZXR1cFtpXSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlxuYWhhMTUyeDogJXNcbiIsIHNldHVwW2ldLmNvbmYpOworCQkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW52YWxpZCBsaW5lXG4iKTsKKwkJCX0KKwkJfQorCQlwcmludGsoIm9rXG4iKTsKKwl9CisKKyNpZiBkZWZpbmVkKFNFVFVQMCkKKwlpZiAoc2V0dXBfY291bnQgPCBBUlJBWV9TSVpFKHNldHVwKSkgeworCQlzdHJ1Y3QgYWhhMTUyeF9zZXR1cCBvdmVycmlkZSA9IFNFVFVQMDsKKworCQlpZiAoc2V0dXBfY291bnQgPT0gMCB8fCAob3ZlcnJpZGUuaW9fcG9ydCAhPSBzZXR1cFswXS5pb19wb3J0KSkgeworCQkJaWYgKCFjaGVja3NldHVwKCZvdmVycmlkZSkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlxuYWhhMTUyeDogaW52YWxpZCBvdmVycmlkZSBTRVRVUDA9ezB4JXgsJWQsJWQsJWQsJWQsJWQsJWQsJWR9XG4iLAorCQkJCSAgICAgICBvdmVycmlkZS5pb19wb3J0LAorCQkJCSAgICAgICBvdmVycmlkZS5pcnEsCisJCQkJICAgICAgIG92ZXJyaWRlLnNjc2lpZCwKKwkJCQkgICAgICAgb3ZlcnJpZGUucmVjb25uZWN0LAorCQkJCSAgICAgICBvdmVycmlkZS5wYXJpdHksCisJCQkJICAgICAgIG92ZXJyaWRlLnN5bmNocm9ub3VzLAorCQkJCSAgICAgICBvdmVycmlkZS5kZWxheSwKKwkJCQkgICAgICAgb3ZlcnJpZGUuZXh0X3RyYW5zKTsKKwkJCX0gZWxzZQorCQkJCXNldHVwW3NldHVwX2NvdW50KytdID0gb3ZlcnJpZGU7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoU0VUVVAxKQorCWlmIChzZXR1cF9jb3VudCA8IEFSUkFZX1NJWkUoc2V0dXApKSB7CisJCXN0cnVjdCBhaGExNTJ4X3NldHVwIG92ZXJyaWRlID0gU0VUVVAxOworCisJCWlmIChzZXR1cF9jb3VudCA9PSAwIHx8IChvdmVycmlkZS5pb19wb3J0ICE9IHNldHVwWzBdLmlvX3BvcnQpKSB7CisJCQlpZiAoIWNoZWNrc2V0dXAoJm92ZXJyaWRlKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiXG5haGExNTJ4OiBpbnZhbGlkIG92ZXJyaWRlIFNFVFVQMT17MHgleCwlZCwlZCwlZCwlZCwlZCwlZCwlZH1cbiIsCisJCQkJICAgICAgIG92ZXJyaWRlLmlvX3BvcnQsCisJCQkJICAgICAgIG92ZXJyaWRlLmlycSwKKwkJCQkgICAgICAgb3ZlcnJpZGUuc2NzaWlkLAorCQkJCSAgICAgICBvdmVycmlkZS5yZWNvbm5lY3QsCisJCQkJICAgICAgIG92ZXJyaWRlLnBhcml0eSwKKwkJCQkgICAgICAgb3ZlcnJpZGUuc3luY2hyb25vdXMsCisJCQkJICAgICAgIG92ZXJyaWRlLmRlbGF5LAorCQkJCSAgICAgICBvdmVycmlkZS5leHRfdHJhbnMpOworCQkJfSBlbHNlCisJCQkJc2V0dXBbc2V0dXBfY291bnQrK10gPSBvdmVycmlkZTsKKwkJfQorCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChNT0RVTEUpCisJaWYgKHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApICYmIChhaGExNTJ4WzBdIT0wIHx8IGlvWzBdIT0wIHx8IGlycVswXSE9MCkpIHsKKwkJaWYoYWhhMTUyeFswXSE9MCkgeworCQkJc2V0dXBbc2V0dXBfY291bnRdLmNvbmYgICAgICAgID0gIiI7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCAgICAgPSBhaGExNTJ4WzBdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgICAgID0gYWhhMTUyeFsxXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IGFoYTE1MnhbMl07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSBhaGExNTJ4WzNdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSAgICAgID0gYWhhMTUyeFs0XTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IGFoYTE1MnhbNV07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgICAgICAgPSBhaGExNTJ4WzZdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyAgID0gYWhhMTUyeFs3XTsKKyNpZiBkZWZpbmVkKEFIQTE1MlhfREVCVUcpCisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVidWcgICAgICAgPSBhaGExNTJ4WzhdOworI2VuZGlmCisJICAJfSBlbHNlIGlmKGlvWzBdIT0wIHx8IGlycVswXSE9MCkgeworCQkJaWYoaW9bMF0hPTApICBzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCA9IGlvWzBdOworCQkJaWYoaXJxWzBdIT0wKSBzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICA9IGlycVswXTsKKworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IHNjc2lpZFswXTsKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSByZWNvbm5lY3RbMF07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSAgICAgID0gcGFyaXR5WzBdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IHN5bmNbMF07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gZGVsYXlbMF07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyAgID0gZXh0dHJhbnNbMF07CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gZGVidWdbMF07CisjZW5kaWYKKwkJfQorCisgICAgICAgICAgCWlmIChjaGVja3NldHVwKCZzZXR1cFtzZXR1cF9jb3VudF0pKQorCQkJc2V0dXBfY291bnQrKzsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBpbnZhbGlkIG1vZHVsZSBwYXJhbXMgaW89MHgleCwgaXJxPSVkLHNjc2lpZD0lZCxyZWNvbm5lY3Q9JWQscGFyaXR5PSVkLHN5bmM9JWQsZGVsYXk9JWQsZXh0dHJhbnM9JWRcbiIsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmlycSwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMpOworCX0KKworCWlmIChzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJiAoYWhhMTUyeDFbMF0hPTAgfHwgaW9bMV0hPTAgfHwgaXJxWzFdIT0wKSkgeworCQlpZihhaGExNTJ4MVswXSE9MCkgeworCQkJc2V0dXBbc2V0dXBfY291bnRdLmNvbmYgICAgICAgID0gIiI7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCAgICAgPSBhaGExNTJ4MVswXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5pcnEgICAgICAgICA9IGFoYTE1MngxWzFdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCAgICAgID0gYWhhMTUyeDFbMl07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSBhaGExNTJ4MVszXTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IGFoYTE1MngxWzRdOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzID0gYWhhMTUyeDFbNV07CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgICAgICAgPSBhaGExNTJ4MVs2XTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGFoYTE1MngxWzddOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwkJCXNldHVwW3NldHVwX2NvdW50XS5kZWJ1ZyAgICAgICA9IGFoYTE1MngxWzhdOworI2VuZGlmCisJICAJfSBlbHNlIGlmKGlvWzFdIT0wIHx8IGlycVsxXSE9MCkgeworCQkJaWYoaW9bMV0hPTApICBzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCA9IGlvWzFdOworCQkJaWYoaXJxWzFdIT0wKSBzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICA9IGlycVsxXTsKKworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IHNjc2lpZFsxXTsKKwkgICAgCQlzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0ICAgPSByZWNvbm5lY3RbMV07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLnBhcml0eSAgICAgID0gcGFyaXR5WzFdOworCSAgICAJCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IHN5bmNbMV07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gZGVsYXlbMV07CisJICAgIAkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyAgID0gZXh0dHJhbnNbMV07CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gZGVidWdbMV07CisjZW5kaWYKKwkJfQorCQlpZiAoY2hlY2tzZXR1cCgmc2V0dXBbc2V0dXBfY291bnRdKSkKKwkJCXNldHVwX2NvdW50Kys7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiYWhhMTUyeDogaW52YWxpZCBtb2R1bGUgcGFyYW1zIGlvPTB4JXgsIGlycT0lZCxzY3NpaWQ9JWQscmVjb25uZWN0PSVkLHBhcml0eT0lZCxzeW5jPSVkLGRlbGF5PSVkLGV4dHRyYW5zPSVkXG4iLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5pcnEsCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnNjc2lpZCwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0ucmVjb25uZWN0LAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5wYXJpdHksCisJCQkgICAgICAgc2V0dXBbc2V0dXBfY291bnRdLnN5bmNocm9ub3VzLAorCQkJICAgICAgIHNldHVwW3NldHVwX2NvdW50XS5kZWxheSwKKwkJCSAgICAgICBzZXR1cFtzZXR1cF9jb3VudF0uZXh0X3RyYW5zKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIF9fSVNBUE5QX18KKwlmb3IoaT0wOyBzZXR1cF9jb3VudDxBUlJBWV9TSVpFKHNldHVwKSAmJiBpZF90YWJsZVtpXS52ZW5kb3I7IGkrKykgeworCQl3aGlsZSAoIHNldHVwX2NvdW50PEFSUkFZX1NJWkUoc2V0dXApICYmCisJCQkoZGV2PXBucF9maW5kX2RldihOVUxMLCBpZF90YWJsZVtpXS52ZW5kb3IsIGlkX3RhYmxlW2ldLmZ1bmN0aW9uLCBkZXYpKSApIHsKKwkJCWlmIChwbnBfZGV2aWNlX2F0dGFjaChkZXYpIDwgMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHBucF9hY3RpdmF0ZV9kZXYoZGV2KSA8IDApIHsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIXBucF9wb3J0X3ZhbGlkKGRldiwgMCkpIHsKKwkJCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoc2V0dXBfY291bnQ9PTEgJiYgcG5wX3BvcnRfc3RhcnQoZGV2LCAwKT09c2V0dXBbMF0uaW9fcG9ydCkgeworCQkJCXBucF9kZXZpY2VfZGV0YWNoKGRldik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXNldHVwW3NldHVwX2NvdW50XS5pb19wb3J0ICAgICA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMCk7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaXJxICAgICAgICAgPSBwbnBfaXJxKGRldiwgMCk7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc2NzaWlkICAgICAgPSA3OworCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCAgID0gMTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IDE7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSAxOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlbGF5ICAgICAgID0gREVMQVlfREVGQVVMVDsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IDA7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnICAgICAgID0gREVCVUdfREVGQVVMVDsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwkJCXBucGRldltzZXR1cF9jb3VudF0gICAgICAgICAgICA9IGRldjsKKyNlbmRpZgorCQkJcHJpbnRrIChLRVJOX0lORk8KKwkJCQkiYWhhMTUyeDogZm91bmQgSVNBUG5QIGFkYXB0ZXIgYXQgaW89MHglMDN4LCBpcnE9JWRcbiIsCisJCQkJc2V0dXBbc2V0dXBfY291bnRdLmlvX3BvcnQsIHNldHVwW3NldHVwX2NvdW50XS5pcnEpOworCQkJc2V0dXBfY291bnQrKzsKKwkJfQorCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChBVVRPQ09ORikKKwlpZiAoc2V0dXBfY291bnQ8QVJSQVlfU0laRShzZXR1cCkpIHsKKyNpZiAhZGVmaW5lZChTS0lQX0JJT1NURVNUKQorCQlvayA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkZHJlc3NlcykgJiYgIW9rOyBpKyspIHsKKwkJCXZvaWQgX19pb21lbSAqcCA9IGlvcmVtYXAoYWRkcmVzc2VzW2ldLCAweDQwMDApOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChqID0gMDsgajxBUlJBWV9TSVpFKHNpZ25hdHVyZXMpICYmICFvazsgaisrKQorCQkJCW9rID0gY2hlY2tfc2lnbmF0dXJlKHAgKyBzaWduYXR1cmVzW2pdLnNpZ19vZmZzZXQsCisJCQkJCQkJCXNpZ25hdHVyZXNbal0uc2lnbmF0dXJlLCBzaWduYXR1cmVzW2pdLnNpZ19sZW5ndGgpOworCQkJaW91bm1hcChwKTsKKwkJfQorCQlpZiAoIW9rICYmIHNldHVwX2NvdW50ID09IDApCisJCQlyZXR1cm4gMDsKKworCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4OiBCSU9TIHRlc3Q6IHBhc3NlZCwgIik7CisjZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICJhaGExNTJ4OiAiKTsKKyNlbmRpZgkJCQkvKiAhU0tJUF9CSU9TVEVTVCAqLworCisJCW9rID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydHMpICYmIHNldHVwX2NvdW50IDwgMjsgaSsrKSB7CisJCQlpZiAoKHNldHVwX2NvdW50ID09IDEpICYmIChzZXR1cFswXS5pb19wb3J0ID09IHBvcnRzW2ldKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCByZXF1ZXN0X3JlZ2lvbihwb3J0c1tpXSwgSU9fUkFOR0UsICJhaGExNTJ4Iik9PTAgKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBpbyBwb3J0IDB4JXggYnVzeS5cbiIsIHBvcnRzW2ldKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGFoYTE1MnhfcG9ydHRlc3QocG9ydHNbaV0pKSB7CisJCQkJc2V0dXBbc2V0dXBfY291bnRdLnRjMTU1MCAgPSAwOworCisJCQkJY29uZi5jZl9wb3J0ID0KKwkJCQkgICAgKEdFVFBPUlQocG9ydHNbaV0gKyBPX1BPUlRBKSA8PCA4KSArIEdFVFBPUlQocG9ydHNbaV0gKyBPX1BPUlRCKTsKKwkJCX0gZWxzZSBpZiAodGMxNTUwX3BvcnR0ZXN0KHBvcnRzW2ldKSkgeworCQkJCXNldHVwW3NldHVwX2NvdW50XS50YzE1NTAgID0gMTsKKworCQkJCWNvbmYuY2ZfcG9ydCA9CisJCQkJICAgIChHRVRQT1JUKHBvcnRzW2ldICsgT19UQ19QT1JUQSkgPDwgOCkgKyBHRVRQT1JUKHBvcnRzW2ldICsgT19UQ19QT1JUQik7CisJCQl9IGVsc2UgeworCQkJCXJlbGVhc2VfcmVnaW9uKHBvcnRzW2ldLCBJT19SQU5HRSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXJlbGVhc2VfcmVnaW9uKHBvcnRzW2ldLCBJT19SQU5HRSk7CisKKwkJCW9rKys7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCA9IHBvcnRzW2ldOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmlycSA9IElSUV9NSU4gKyBjb25mLmNmX2lycTsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgPSBjb25mLmNmX2lkOworCQkJc2V0dXBbc2V0dXBfY291bnRdLnJlY29ubmVjdCA9IGNvbmYuY2ZfdGFyZGlzYzsKKwkJCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgPSAhY29uZi5jZl9wYXJpdHk7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uc3luY2hyb25vdXMgPSBjb25mLmNmX3N5bmNuZWc7CisJCQlzZXR1cFtzZXR1cF9jb3VudF0uZGVsYXkgPSBERUxBWV9ERUZBVUxUOworCQkJc2V0dXBbc2V0dXBfY291bnRdLmV4dF90cmFucyA9IDA7CisjaWYgZGVmaW5lZChBSEExNTJYX0RFQlVHKQorCQkJc2V0dXBbc2V0dXBfY291bnRdLmRlYnVnID0gREVCVUdfREVGQVVMVDsKKyNlbmRpZgorCQkJc2V0dXBfY291bnQrKzsKKworCQl9CisKKwkJaWYgKG9rKQorCQkJcHJpbnRrKCJhdXRvIGNvbmZpZ3VyYXRpb246IG9rLCAiKTsKKwl9CisjZW5kaWYKKworCXByaW50aygiJWQgY29udHJvbGxlcihzKSBjb25maWd1cmVkXG4iLCBzZXR1cF9jb3VudCk7CisKKwlmb3IgKGk9MDsgaTxzZXR1cF9jb3VudDsgaSsrKSB7CisJCWlmICggcmVxdWVzdF9yZWdpb24oc2V0dXBbaV0uaW9fcG9ydCwgSU9fUkFOR0UsICJhaGExNTJ4IikgKSB7CisJCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaHBudCA9IGFoYTE1MnhfcHJvYmVfb25lKCZzZXR1cFtpXSk7CisKKwkJCWlmKCAhc2hwbnQgKSB7CisJCQkJcmVsZWFzZV9yZWdpb24oc2V0dXBbaV0uaW9fcG9ydCwgSU9fUkFOR0UpOworI2lmIGRlZmluZWQoX19JU0FQTlBfXykKKwkJCX0gZWxzZSBpZiggcG5wZGV2W2ldICkgeworCQkJCUhPU1REQVRBKHNocG50KS0+cG5wZGV2PXBucGRldltpXTsKKwkJCQlwbnBkZXZbaV09TlVMTDsKKyNlbmRpZgorCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiBpbyBwb3J0IDB4JXggYnVzeS5cbiIsIHNldHVwW2ldLmlvX3BvcnQpOworCQl9CisKKyNpZiBkZWZpbmVkKF9fSVNBUE5QX18pCisJCWlmKCBwbnBkZXZbaV0gKQorCQkJcG5wX2RldmljZV9kZXRhY2gocG5wZGV2W2ldKTsKKyNlbmRpZgorCX0KKworCXJldHVybiByZWdpc3RlcmVkX2NvdW50PjA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhaGExNTJ4X2V4aXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcihpPTA7IGk8QVJSQVlfU0laRShzZXR1cCk7IGkrKykgeworCQlhaGExNTJ4X3JlbGVhc2UoYWhhMTUyeF9ob3N0W2ldKTsKKwkJYWhhMTUyeF9ob3N0W2ldPU5VTEw7CisJfQorfQorCittb2R1bGVfaW5pdChhaGExNTJ4X2luaXQpOworbW9kdWxlX2V4aXQoYWhhMTUyeF9leGl0KTsKKworI2lmICFkZWZpbmVkKE1PRFVMRSkKK3N0YXRpYyBpbnQgX19pbml0IGFoYTE1Mnhfc2V0dXAoY2hhciAqc3RyKQoreworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlpbnQgaW50c1sxMV07CisjZWxzZQorCWludCBpbnRzWzEwXTsKKyNlbmRpZgorCWdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpZihzZXR1cF9jb3VudD49QVJSQVlfU0laRShzZXR1cCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhaGExNTJ4OiB5b3UgY2FuIG9ubHkgY29uZmlndXJlIHVwIHRvIHR3byBjb250cm9sbGVyc1xuIik7CisJCXJldHVybiAxOworCX0KKworCXNldHVwW3NldHVwX2NvdW50XS5jb25mICAgICAgICA9IHN0cjsKKwlzZXR1cFtzZXR1cF9jb3VudF0uaW9fcG9ydCAgICAgPSBpbnRzWzBdID49IDEgPyBpbnRzWzFdIDogMHgzNDA7CisJc2V0dXBbc2V0dXBfY291bnRdLmlycSAgICAgICAgID0gaW50c1swXSA+PSAyID8gaW50c1syXSA6IDExOworCXNldHVwW3NldHVwX2NvdW50XS5zY3NpaWQgICAgICA9IGludHNbMF0gPj0gMyA/IGludHNbM10gOiA3OworCXNldHVwW3NldHVwX2NvdW50XS5yZWNvbm5lY3QgICA9IGludHNbMF0gPj0gNCA/IGludHNbNF0gOiAxOworCXNldHVwW3NldHVwX2NvdW50XS5wYXJpdHkgICAgICA9IGludHNbMF0gPj0gNSA/IGludHNbNV0gOiAxOworCXNldHVwW3NldHVwX2NvdW50XS5zeW5jaHJvbm91cyA9IGludHNbMF0gPj0gNiA/IGludHNbNl0gOiAxOworCXNldHVwW3NldHVwX2NvdW50XS5kZWxheSAgICAgICA9IGludHNbMF0gPj0gNyA/IGludHNbN10gOiBERUxBWV9ERUZBVUxUOworCXNldHVwW3NldHVwX2NvdW50XS5leHRfdHJhbnMgICA9IGludHNbMF0gPj0gOCA/IGludHNbOF0gOiAwOworI2lmIGRlZmluZWQoQUhBMTUyWF9ERUJVRykKKwlzZXR1cFtzZXR1cF9jb3VudF0uZGVidWcgICAgICAgPSBpbnRzWzBdID49IDkgPyBpbnRzWzldIDogREVCVUdfREVGQVVMVDsKKwlpZiAoaW50c1swXSA+IDkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJhaGExNTJ4OiB1c2FnZTogYWhhMTUyeD08SU9CQVNFPlssPElSUT5bLDxTQ1NJIElEPiIKKwkJICAgICAgICJbLDxSRUNPTk5FQ1Q+Wyw8UEFSSVRZPlssPFNZTkNIUk9OT1VTPlssPERFTEFZPlssPEVYVF9UUkFOUz5bLDxERUJVRz5dXV1dXV1dXVxuIik7CisjZWxzZQorCWlmIChpbnRzWzBdID4gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qfSovCisJCXByaW50ayhLRVJOX05PVElDRSAiYWhhMTUyeDogdXNhZ2U6IGFoYTE1Mng9PElPQkFTRT5bLDxJUlE+Wyw8U0NTSSBJRD4iCisJCSAgICAgICAiWyw8UkVDT05ORUNUPlssPFBBUklUWT5bLDxTWU5DSFJPTk9VUz5bLDxERUxBWT5bLDxFWFRfVFJBTlM+XV1dXV1dXVxuIik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlzZXR1cF9jb3VudCsrOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImFoYTE1Mng9IiwgYWhhMTUyeF9zZXR1cCk7CisjZW5kaWYKKworI2VuZGlmIC8qICFQQ01DSUEgKi8K