Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLgogKgogKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHRhcmJhbGwgZm9yIGRldGFpbHMuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucwogKgogKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCiAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgogKgogKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCiAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgogKgogKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgogKgogKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAogKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCiAqCiAqCiAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQogKgkJa2VybmVsIGJ1ZyBhdGUgbXkgZW5oYW5jZWQgZnNjayBpbiBmZWJydWFyeS4KICoKICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCiAqCiAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLWJsb2NrIGluZm9ybWF0aW9uCiAqCiAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKICoKICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbwogKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCiAqCQkJICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KICoJCQkgICAgICBpcyBleGVjdXRlZC4KICoKICogMzAuMTAuOTQgLSBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCiAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCiAqCiAqIDEwLjEyLjk0ICAtICBhZGRlZCB0ZXN0IHRvIHByZXZlbnQgY2hlY2tpbmcgb2YgbW91bnRlZCBmcyBhZGFwdGVkCiAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjawogKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQogKgogKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAogKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51awogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCiAqCSAgICAgICAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKICogICAgICAgICAgICAgd2FybmluZ3MuICBBZGRlZCBtYzY4ayBiaXRvcHMgZnJvbQogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KICovCgojaW5jbHVkZSAiYnVzeWJveC5oIgojaW5jbHVkZSA8bW50ZW50Lmg+CgojaW5jbHVkZSAibWluaXguaCIKCiNpZm5kZWYgQkxLR0VUU0laRQojZGVmaW5lIEJMS0dFVFNJWkUgX0lPKDB4MTIsOTYpICAgIC8qIHJldHVybiBkZXZpY2Ugc2l6ZSAqLwojZW5kaWYKCiNpZmRlZiBVTlVTRUQKZW51bSB7CglNSU5JWDFfTElOS19NQVggPSAyNTAsCglNSU5JWDJfTElOS19NQVggPSA2NTUzMCwKCU1JTklYX0lfTUFQX1NMT1RTID0gOCwKCU1JTklYX1pfTUFQX1NMT1RTID0gNjQsCglNSU5JWF9WMSA9IDB4MDAwMSwgICAgICAvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwoJTUlOSVhfVjIgPSAweDAwMDIsICAgICAgLyogbWluaXggVjIgZnMgKi8KCU5BTUVfTUFYID0gMjU1LCAgICAgICAgIC8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KfTsKI2VuZGlmCgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBzbWFsbGludCB2ZXJzaW9uMjsKI2Vsc2UKZW51bSB7IHZlcnNpb24yID0gMCB9OwojZW5kaWYKCiNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjIgLSAxMS8xMS85NiIKc3RhdGljIHNtYWxsaW50IHJlcGFpciwgYXV0b21hdGljLCB2ZXJib3NlLCBsaXN0LCBzaG93LCB3YXJuX21vZGUsIGZvcmNlOwpzdGF0aWMgc21hbGxpbnQgY2hhbmdlZDsgIC8qIGlzIGZpbGVzeXN0ZW0gbW9kaWZpZWQ/ICovCnN0YXRpYyBzbWFsbGludCBlcnJvcnNfdW5jb3JyZWN0ZWQ7ICAvKiBmbGFnIGlmIHNvbWUgZXJyb3Igd2FzIG5vdCBjb3JyZWN0ZWQgKi8KCnN0YXRpYyBzbWFsbGludCB0ZXJtaW9zX3NldDsKc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CgpzdGF0aWMgY2hhciAqZGV2aWNlX25hbWU7CnN0YXRpYyBpbnQgSU47CnN0YXRpYyBpbnQgZGlyZWN0b3J5LCByZWd1bGFyLCBibG9ja2RldiwgY2hhcmRldiwgbGlua3MsIHN5bWxpbmtzLCB0b3RhbDsKCi8vYWxzbyBzbWFsbGludD8Kc3RhdGljIGludCBkaXJzaXplID0gMTY7CnN0YXRpYyBpbnQgbmFtZWxlbiA9IDE0OwoKc3RhdGljIGNoYXIgKmlub2RlX2J1ZmZlcjsKLy94emFsbG9jPwpzdGF0aWMgY2hhciBzdXBlcl9ibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CgojZGVmaW5lIElub2RlMSAoKChzdHJ1Y3QgbWluaXgxX2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKI2RlZmluZSBJbm9kZTIgKCgoc3RydWN0IG1pbml4Ml9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCgojZGVmaW5lIFN1cGVyICgqKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKXN1cGVyX2Jsb2NrX2J1ZmZlcikKCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKIyBkZWZpbmUgWk9ORVMgICAgKCh1bnNpZ25lZCkodmVyc2lvbjIgPyBTdXBlci5zX3pvbmVzIDogU3VwZXIuc19uem9uZXMpKQojZWxzZQojIGRlZmluZSBaT05FUyAgICAoKHVuc2lnbmVkKShTdXBlci5zX256b25lcykpCiNlbmRpZgojZGVmaW5lIElOT0RFUyAgICAoKHVuc2lnbmVkKVN1cGVyLnNfbmlub2RlcykKI2RlZmluZSBJTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX2ltYXBfYmxvY2tzKQojZGVmaW5lIFpNQVBTICAgICAoKHVuc2lnbmVkKVN1cGVyLnNfem1hcF9ibG9ja3MpCiNkZWZpbmUgRklSU1RaT05FICgodW5zaWduZWQpU3VwZXIuc19maXJzdGRhdGF6b25lKQojZGVmaW5lIFpPTkVTSVpFICAoKHVuc2lnbmVkKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKI2RlZmluZSBNQVhTSVpFICAgKCh1bnNpZ25lZClTdXBlci5zX21heF9zaXplKQojZGVmaW5lIE1BR0lDICAgICAoU3VwZXIuc19tYWdpYykKCi8qIGdjYyBsaWtlcyB0aGlzIG1vcmUgKGNvZGUgaXMgc21hbGxlcikgdGhhbiBtYWNybyB2YXJpYW50ICovCnN0YXRpYyBBVFRSSUJVVEVfQUxXQVlTX0lOTElORSB1bnNpZ25lZCBkaXZfcm91bmR1cCh1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBuKQp7CglyZXR1cm4gKHNpemUgKyBuLTEpIC8gbjsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgojZGVmaW5lIElOT0RFX0JMT0NLUyBkaXZfcm91bmR1cChJTk9ERVMsICh2ZXJzaW9uMiA/IE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIFwKCQkJCSAgICA6IE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLKSkKI2Vsc2UKI2RlZmluZSBJTk9ERV9CTE9DS1MgZGl2X3JvdW5kdXAoSU5PREVTLCBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykKI2VuZGlmCgojZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQojZGVmaW5lIE5PUk1fRklSU1RaT05FICAgICgyICsgSU1BUFMgKyBaTUFQUyArIElOT0RFX0JMT0NLUykKCnN0YXRpYyBjaGFyICppbm9kZV9tYXA7CnN0YXRpYyBjaGFyICp6b25lX21hcDsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudDsKc3RhdGljIHVuc2lnbmVkIGNoYXIgKnpvbmVfY291bnQ7CgovKiBCZWZvcmUgeW91IGFzayAid2hlcmUgdGhleSBjb21lIGZyb20/IjogKi8KLyogc2V0Yml0L2NscmJpdCBhcmUgc3VwcGxpZWQgYnkgc3lzL3BhcmFtLmggKi8KCnN0YXRpYyBpbnQgbWluaXhfYml0KGNvbnN0IGNoYXIgKmEsIHVuc2lnbmVkIGkpCnsKCXJldHVybiAoYVtpID4+IDNdICYgKDE8PChpICYgNykpKTsKfQoKc3RhdGljIHZvaWQgbWluaXhfc2V0Yml0KGNoYXIgKmEsIHVuc2lnbmVkIGkpCnsKCXNldGJpdChhLCBpKTsKCWNoYW5nZWQgPSAxOwp9CnN0YXRpYyB2b2lkIG1pbml4X2NscmJpdChjaGFyICphLCB1bnNpZ25lZCBpKQp7CgljbHJiaXQoYSwgaSk7CgljaGFuZ2VkID0gMTsKfQoKLyogTm90ZTogZG8gbm90IGFzc3VtZSAwLzEsIGl0IGlzIDAvbm9uemVybyAqLwojZGVmaW5lIHpvbmVfaW5fdXNlKHgpICAobWluaXhfYml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCiNkZWZpbmUgaW5vZGVfaW5fdXNlKHgpIChtaW5peF9iaXQoaW5vZGVfbWFwLCh4KSkpCgojZGVmaW5lIG1hcmtfaW5vZGUoeCkgICAobWluaXhfc2V0Yml0KGlub2RlX21hcCwoeCkpKQojZGVmaW5lIHVubWFya19pbm9kZSh4KSAobWluaXhfY2xyYml0KGlub2RlX21hcCwoeCkpKQoKI2RlZmluZSBtYXJrX3pvbmUoeCkgICAobWluaXhfc2V0Yml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSkpCiNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgKG1pbml4X2NscmJpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQoKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbm8pOwojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW5vKTsKI2VuZGlmCgpzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKSBBVFRSSUJVVEVfTk9SRVRVUk47CnN0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICpzdHIpCnsKCWlmICh0ZXJtaW9zX3NldCkKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgc3RyKTsKfQoKLyogRmlsZS1uYW1lIGRhdGEgKi8KZW51bSB7IE1BWF9ERVBUSCA9IDMyIH07CnN0YXRpYyBpbnQgbmFtZV9kZXB0aDsKc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKc3RhdGljIGNoYXIgKm5hbWVfY29tcG9uZW50W01BWF9ERVBUSCsxXTsKCi8qIFdlZCBGZWIgIDkgMTU6MTc6MDYgTVNUIDIwMDAgKi8KLyogZHluYW1pY2FsbHkgYWxsb2NhdGUgbmFtZV9saXN0IChpbnN0ZWFkIG9mIG1ha2luZyBpdCBzdGF0aWMpICovCnN0YXRpYyB2b2lkIGFsbG9jX2N1cnJlbnRfbmFtZSh2b2lkKQp7CgljdXJyZW50X25hbWUgPSB4bWFsbG9jKE1BWF9ERVBUSCAqIChCVUZTSVogKyAxKSk7CgljdXJyZW50X25hbWVbMF0gPSAnLyc7CgljdXJyZW50X25hbWVbMV0gPSAnXDAnOwoJbmFtZV9jb21wb25lbnRbMF0gPSAmY3VycmVudF9uYW1lWzBdOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKLyogZXhlY3V0ZSB0aGlzIGF0ZXhpdCgpIHRvIGRlYWxsb2NhdGUgbmFtZV9saXN0W10gKi8KLyogcGlwdGlnZ2VyIHdhcyBoZXJlICovCnN0YXRpYyB2b2lkIGZyZWVfY3VycmVudF9uYW1lKHZvaWQpCnsKCWZyZWUoY3VycmVudF9uYW1lKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHB1c2hfZmlsZW5hbWUoY29uc3QgY2hhciAqbmFtZSkKewoJLy8gIC9kaXIvZGlyL2Rpci9maWxlCgkvLyAgXiAgIF4gICBeCgkvLyBbMF0gWzFdIFsyXSA8LW5hbWVfY29tcG9uZW50W2ldCglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkgewoJCWludCBsZW47CgkJY2hhciAqcCA9IG5hbWVfY29tcG9uZW50W25hbWVfZGVwdGhdOwoJCSpwKysgPSAnLyc7CgkJbGVuID0gc3ByaW50ZihwLCAiJS4qcyIsIG5hbWVsZW4sIG5hbWUpOwoJCW5hbWVfY29tcG9uZW50W25hbWVfZGVwdGggKyAxXSA9IHAgKyBsZW47Cgl9CgluYW1lX2RlcHRoKys7Cn0KCnN0YXRpYyB2b2lkIHBvcF9maWxlbmFtZSh2b2lkKQp7CgluYW1lX2RlcHRoLS07CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkgewoJCSpuYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoXSA9ICdcMCc7CgkJaWYgKCFuYW1lX2RlcHRoKSB7CgkJCWN1cnJlbnRfbmFtZVswXSA9ICcvJzsKCQkJY3VycmVudF9uYW1lWzFdID0gJ1wwJzsKCQl9Cgl9Cn0KCnN0YXRpYyBpbnQgYXNrKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGRlZikKewoJaW50IGM7CgoJaWYgKCFyZXBhaXIpIHsKCQlwdXRzKCIiKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiAwOwoJfQoJaWYgKGF1dG9tYXRpYykgewoJCXB1dHMoIiIpOwoJCWlmICghZGVmKQoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCXJldHVybiBkZWY7Cgl9CglwcmludGYoZGVmID8gIiVzICh5L24pPyAiIDogIiVzIChuL3kpPyAiLCBzdHJpbmcpOwoJZm9yICg7OykgewoJCWZmbHVzaChzdGRvdXQpOwoJCWMgPSBnZXRjaGFyKCk7CgkJaWYgKGMgPT0gRU9GKSB7CgkJCWlmICghZGVmKQoJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJcmV0dXJuIGRlZjsKCQl9CgkJYyA9IHRvdXBwZXIoYyk7CgkJaWYgKGMgPT0gJ1knKSB7CgkJCWRlZiA9IDE7CgkJCWJyZWFrOwoJCX0gZWxzZSBpZiAoYyA9PSAnTicpIHsKCQkJZGVmID0gMDsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICcgJyB8fCBjID09ICdcbicpCgkJCWJyZWFrOwoJfQoJaWYgKGRlZikKCQlwcmludGYoInlcbiIpOwoJZWxzZSB7CgkJcHJpbnRmKCJuXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGRlZjsKfQoKLyoKICogTWFrZSBjZXJ0YWluIHRoYXQgd2UgYXJlbid0IGNoZWNraW5nIGEgZmlsZXN5c3RlbSB0aGF0IGlzIG9uIGEKICogbW91bnRlZCBwYXJ0aXRpb24uICBDb2RlIGFkYXB0ZWQgZnJvbSBlMmZzY2ssIENvcHlyaWdodCAoQykgMTk5MywKICogMTk5NCBUaGVvZG9yZSBUcydvLiAgQWxzbyBsaWNlbnNlZCB1bmRlciBHUEwuCiAqLwpzdGF0aWMgdm9pZCBjaGVja19tb3VudCh2b2lkKQp7CglGSUxFICpmOwoJc3RydWN0IG1udGVudCAqbW50OwoJaW50IGNvbnQ7CglpbnQgZmQ7CgoJZiA9IHNldG1udGVudChNT1VOVEVELCAiciIpOwoJaWYgKGYgPT0gTlVMTCkKCQlyZXR1cm47Cgl3aGlsZSAoKG1udCA9IGdldG1udGVudChmKSkgIT0gTlVMTCkKCQlpZiAoc3RyY21wKGRldmljZV9uYW1lLCBtbnQtPm1udF9mc25hbWUpID09IDApCgkJCWJyZWFrOwoJZW5kbW50ZW50KGYpOwoJaWYgKCFtbnQpCgkJcmV0dXJuOwoKCS8qCgkgKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQtb25seSwgdGhlbiAvZXRjL210YWIgaXMKCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KCSAqIGl0LgoJICovCglmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSKTsKCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCgkJcmV0dXJuOwoJY2xvc2UoZmQpOwoKCXByaW50ZigiJXMgaXMgbW91bnRlZC4gIiwgZGV2aWNlX25hbWUpOwoJY29udCA9IDA7CglpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKCWlmICghY29udCkgewoJCXByaW50ZigiQ2hlY2sgYWJvcnRlZFxuIik7CgkJZXhpdCgwKTsKCX0KfQoKLyoKICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKICogaXNuJ3QsIGl0IHdpbGwgcG9zc2libHkgYmUgcmVwYWlyZWQuIENoZWNrX3pvbmVfbnIgc2V0cyAqY29ycmVjdGVkCiAqIGlmIGFuIGVycm9yIHdhcyBjb3JyZWN0ZWQsIGFuZCByZXR1cm5zIHRoZSB6b25lICgwIGZvciBubyB6b25lCiAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KICovCnN0YXRpYyBpbnQgY2hlY2tfem9uZV9ucjIodWludDMyX3QgKm5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7Cgljb25zdCBjaGFyICptc2c7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJbXNnID0gIjwgRklSU1RaT05FIjsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQltc2cgPSAiPj0gWk9ORVMiOwoJZWxzZQoJCXJldHVybiAqbnI7CglwcmludGYoIlpvbmUgbnIgJXMgaW4gZmlsZSAnJXMnLiAiLCBtc2csIGN1cnJlbnRfbmFtZSk7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBjaGVja196b25lX25yKHVpbnQxNl90ICpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJdWludDMyX3QgbnIzMiA9ICpucjsKCWludCByID0gY2hlY2tfem9uZV9ucjIoJm5yMzIsIGNvcnJlY3RlZCk7CgkqbnIgPSAodWludDE2X3QpbnIzMjsKCXJldHVybiByOwp9CgovKgogKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgogKi8Kc3RhdGljIHZvaWQgcmVhZF9ibG9jayh1bnNpZ25lZCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikgewoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkgewoJCXByaW50ZigiJXM6IGNhbm5vdCBzZWVrIHRvIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ19yZWFkX2Vycm9yLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJfSBlbHNlIGlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCIlczogYmFkIGJsb2NrIGluIGZpbGUgJyVzJ1xuIiwKCQkJCWJiX21zZ19yZWFkX2Vycm9yLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJfQp9CgovKgogKiB3cml0ZV9ibG9jayB3cml0ZXMgYmxvY2sgbnIgdG8gZGlzay4KICovCnN0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIG5yLCBjaGFyICphZGRyKQp7CglpZiAoIW5yKQoJCXJldHVybjsKCWlmIChuciA8IEZJUlNUWk9ORSB8fCBuciA+PSBaT05FUykgewoJCXByaW50ZigiSW50ZXJuYWwgZXJyb3I6IHRyeWluZyB0byB3cml0ZSBiYWQgYmxvY2tcbiIKCQkJICAgIldyaXRlIHJlcXVlc3QgaWdub3JlZFxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIiVzOiBiYWQgYmxvY2sgaW4gZmlsZSAnJXMnXG4iLAoJCQkJYmJfbXNnX3dyaXRlX2Vycm9yLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cn0KCi8qCiAqIG1hcF9ibG9jayBjYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBibG9jayBuciBvZiBhIGJsb2NrIGluIGEgZmlsZS4KICogSXQgc2V0cyAnY2hhbmdlZCcgaWYgdGhlIGlub2RlIGhhcyBuZWVkZWQgY2hhbmdpbmcsIGFuZCByZS13cml0ZXMKICogYW55IGluZGlyZWN0IGJsb2NrcyB3aXRoIGVycm9ycy4KICovCnN0YXRpYyBpbnQgbWFwX2Jsb2NrKHN0cnVjdCBtaW5peDFfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBibGtucikKewoJdWludDE2X3QgaW5kW0JMT0NLX1NJWkUgPj4gMV07Cgl1aW50MTZfdCBkaW5kW0JMT0NLX1NJWkUgPj4gMV07CglpbnQgYmxvY2ssIHJlc3VsdDsKCXNtYWxsaW50IGJsa19jaGc7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCA1MTIpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDUxMjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoZGluZCArIChibGtuciAvIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihpbmQgKyAoYmxrbnIgJSA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KCiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBtYXBfYmxvY2syKHN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBibGtucikKewoJdWludDMyX3QgaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1aW50MzJfdCBkaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1aW50MzJfdCB0aW5kW0JMT0NLX1NJWkUgPj4gMl07CglpbnQgYmxvY2ssIHJlc3VsdDsKCXNtYWxsaW50IGJsa19jaGc7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDI1NjsKCWlmIChibGtuciA+PSAyNTYgKiAyNTYpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA4LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoZGluZCArIGJsa25yIC8gMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibG9jayA9IHJlc3VsdDsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTYgKiAyNTY7CglibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA5LCAmY2hhbmdlZCk7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIodGluZCArIGJsa25yIC8gKDI1NiAqIDI1NiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSB0aW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyAoYmxrbnIgLyAyNTYpICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGluZCArIGJsa25yICUgMjU2LCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCB3cml0ZV9zdXBlcl9ibG9jayh2b2lkKQp7CgkvKgoJICogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZQoJICogYXJlIHVuY29ycmVjdGVkIGVycm9ycy4gIFRoZSBmaWxlc3lzdGVtIHZhbGlkIGZsYWcgaXMKCSAqIHVuY29uZGl0aW9uYWxseSBzZXQgaWYgd2UgZ2V0IHRoaXMgZmFyLgoJICovCglTdXBlci5zX3N0YXRlIHw9IE1JTklYX1ZBTElEX0ZTIHwgTUlOSVhfRVJST1JfRlM7CglpZiAoIWVycm9yc191bmNvcnJlY3RlZCkKCQlTdXBlci5zX3N0YXRlICY9IH5NSU5JWF9FUlJPUl9GUzsKCglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfc3VwZXJfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgiY2Fubm90IHdyaXRlIHN1cGVyLWJsb2NrIik7Cn0KCnN0YXRpYyB2b2lkIHdyaXRlX3RhYmxlcyh2b2lkKQp7Cgl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoImNhbm5vdCB3cml0ZSBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiY2Fubm90IHdyaXRlIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gd3JpdGUoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiY2Fubm90IHdyaXRlIGlub2RlcyIpOwp9CgpzdGF0aWMgdm9pZCBnZXRfZGlyc2l6ZSh2b2lkKQp7CglpbnQgYmxvY2s7CgljaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBzaXplOwoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgoJaWYgKHZlcnNpb24yKQoJCWJsb2NrID0gSW5vZGUyW01JTklYX1JPT1RfSU5PXS5pX3pvbmVbMF07CgllbHNlCiNlbmRpZgoJCWJsb2NrID0gSW5vZGUxW01JTklYX1JPT1RfSU5PXS5pX3pvbmVbMF07CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChzaXplID0gMTY7IHNpemUgPCBCTE9DS19TSVpFOyBzaXplIDw8PSAxKSB7CgkJaWYgKHN0cmNtcChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgewoJCQlkaXJzaXplID0gc2l6ZTsKCQkJbmFtZWxlbiA9IHNpemUgLSAyOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogdXNlIGRlZmF1bHRzICovCn0KCnN0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQp7CglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQiKTsKCWlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCBzdXBlciBibG9jayIpOwoJLyogYWxyZWFkeSBpbml0aWFsaXplZCB0bzoKCW5hbWVsZW4gPSAxNDsKCWRpcnNpemUgPSAxNjsKCXZlcnNpb24yID0gMDsKCSovCglpZiAoTUFHSUMgPT0gTUlOSVgxX1NVUEVSX01BR0lDKSB7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMV9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQykgewoJCXZlcnNpb24yID0gMTsKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAxOwojZW5kaWYKCX0gZWxzZQoJCWRpZSgiYmFkIG1hZ2ljIG51bWJlciBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpPTkVTSVpFICE9IDAgfHwgQkxPQ0tfU0laRSAhPSAxMDI0KQoJCWRpZSgib25seSAxayBibG9ja3Mvem9uZXMgc3VwcG9ydGVkIik7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICogOCA8IElOT0RFUyArIDEpCgkJZGllKCJiYWQgc19pbWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAqIDggPCBaT05FUyAtIEZJUlNUWk9ORSArIDEpCgkJZGllKCJiYWQgc196bWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlci1ibG9jayIpOwp9CgpzdGF0aWMgdm9pZCByZWFkX3RhYmxlcyh2b2lkKQp7Cglpbm9kZV9tYXAgPSB4emFsbG9jKElNQVBTICogQkxPQ0tfU0laRSk7Cgl6b25lX21hcCA9IHh6YWxsb2MoWk1BUFMgKiBCTE9DS19TSVpFKTsKCWlub2RlX2J1ZmZlciA9IHhtYWxsb2MoSU5PREVfQlVGRkVSX1NJWkUpOwoJaW5vZGVfY291bnQgPSB4bWFsbG9jKElOT0RFUyArIDEpOwoJem9uZV9jb3VudCA9IHhtYWxsb2MoWk9ORVMpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJjYW5ub3QgcmVhZCB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHJlYWQoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiY2Fubm90IHJlYWQgaW5vZGVzIik7CglpZiAoTk9STV9GSVJTVFpPTkUgIT0gRklSU1RaT05FKSB7CgkJcHJpbnRmKCJ3YXJuaW5nOiBmaXJzdHpvbmUhPW5vcm1fZmlyc3R6b25lXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJZ2V0X2RpcnNpemUoKTsKCWlmIChzaG93KSB7CgkJcHJpbnRmKCIldSBpbm9kZXNcbiIKCQkJIiV1IGJsb2Nrc1xuIgoJCQkiRmlyc3RkYXRhem9uZT0ldSAoJXUpXG4iCgkJCSJab25lc2l6ZT0ldVxuIgoJCQkiTWF4c2l6ZT0ldVxuIgoJCQkiRmlsZXN5c3RlbSBzdGF0ZT0ldVxuIgoJCQkibmFtZWxlbj0ldVxuXG4iLAoJCQlJTk9ERVMsCgkJCVpPTkVTLAoJCQlGSVJTVFpPTkUsIE5PUk1fRklSU1RaT05FLAoJCQlCTE9DS19TSVpFIDw8IFpPTkVTSVpFLAoJCQlNQVhTSVpFLAoJCQlTdXBlci5zX3N0YXRlLAoJCQluYW1lbGVuKTsKCX0KfQoKc3RhdGljIHN0cnVjdCBtaW5peDFfaW5vZGUgKmdldF9pbm9kZSh1bnNpZ25lZCBucikKewoJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlMSArIG5yOwoJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKCQlpZiAoIWlub2RlX2luX3VzZShucikpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBpcyBtYXJrZWQgYXMgJ3VudXNlZCcsIGJ1dCBpdCBpcyB1c2VkICIKCQkJCQkiZm9yIGZpbGUgJyVzJ1xuIiwgbnIsIGN1cnJlbnRfbmFtZSk7CgkJCWlmIChyZXBhaXIpIHsKCQkJCWlmIChhc2soIk1hcmsgYXMgJ2luIHVzZSciLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJCWVsc2UKCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludGYoIiVzIGhhcyBtb2RlICUwNW9cbiIsIGN1cnJlbnRfbmFtZSwgaW5vZGUtPmlfbW9kZSk7CgkJfQoKCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBzdHJ1Y3QgbWluaXgyX2lub2RlICpnZXRfaW5vZGUyKHVuc2lnbmVkIG5yKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUyICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIG1hcmtlZCBhcyAndW51c2VkJywgYnV0IGl0IGlzIHVzZWQgIgoJCQkJCSJmb3IgZmlsZSAnJXMnXG4iLCBuciwgY3VycmVudF9uYW1lKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBhcyAnaW4gdXNlJyIsIDEpKQoJCQkJCW1hcmtfaW5vZGUobnIpOwoJCQkJZWxzZQoJCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50ZigiJXMgaGFzIG1vZGUgJTA1b1xuIiwgY3VycmVudF9uYW1lLCBpbm9kZS0+aV9tb2RlKTsKCQl9Cgl9IGVsc2UKCQlsaW5rcysrOwoJaWYgKCErK2lub2RlX2NvdW50W25yXSkgewoJCXByaW50ZigiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZ1xuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3Qodm9pZCkKewoJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUgPSBJbm9kZTEgKyBNSU5JWF9ST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgTUlOSVhfUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQojZWxzZQp2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpOwojZW5kaWYKCnN0YXRpYyBpbnQgYWRkX3pvbmUodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoem9uZV9jb3VudFtibG9ja10pIHsKCQlwcmludGYoIkFscmVhZHkgdXNlZCBibG9jayBpcyByZXVzZWQgaW4gZmlsZSAnJXMnLiAiLAoJCQkJY3VycmVudF9uYW1lKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCQlyZXR1cm4gMDsKCQl9Cgl9CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSAnJXMnIGlzIG1hcmtlZCBhcyAndW51c2VkJy4gIiwKCQkJCWJsb2NrLCBjdXJyZW50X25hbWUpOwoJCWlmIChhc2soIkNvcnJlY3QiLCAxKSkKCQkJbWFya196b25lKGJsb2NrKTsKCX0KCWlmICghKyt6b25lX2NvdW50W2Jsb2NrXSkKCQl6b25lX2NvdW50W2Jsb2NrXS0tOwoJcmV0dXJuIGJsb2NrOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgYWRkX3pvbmUyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQWxyZWFkeSB1c2VkIGJsb2NrIGlzIHJldXNlZCBpbiBmaWxlICclcycuICIsCgkJCQljdXJyZW50X25hbWUpOwoJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKCQkJKnpuciA9IDA7CgkJCWJsb2NrID0gMDsKCQkJKmNvcnJlY3RlZCA9IDE7CgkJCXJldHVybiAwOwoJCX0KCX0KCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CgkJcHJpbnRmKCJCbG9jayAlZCBpbiBmaWxlICclcycgaXMgbWFya2VkIGFzICd1bnVzZWQnLiAiLAoJCQkJYmxvY2ssIGN1cnJlbnRfbmFtZSk7CgkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQodWludDE2X3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGk7CglpbnQgYmxvY2s7CglzbWFsbGludCBjaGdfYmxrID0gMDsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lKGkgKyAodWludDE2X3QgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpOwoJaW50IGJsb2NrOwoJc21hbGxpbnQgY2hnX2JsayA9IDA7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lMihpICsgKHVpbnQzMl90ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kKHVpbnQxNl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpOwoJaW50IGJsb2NrOwoJc21hbGxpbnQgY2hnX2JsayA9IDA7CgoJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKCQlhZGRfem9uZV9pbmQoaSArICh1aW50MTZfdCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQyKHVpbnQzMl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpOwoJaW50IGJsb2NrOwoJc21hbGxpbnQgY2hnX2JsayA9IDA7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2luZDIoaSArICh1aW50MzJfdCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgpzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaTsKCWludCBibG9jazsKCXNtYWxsaW50IGNoZ19ibGsgPSAwOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZV9kaW5kMihpICsgKHVpbnQzMl90ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja196b25lcyh1bnNpZ25lZCBpKQp7CglzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUxICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgoJCSFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSByZXR1cm47Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQoJCWFkZF96b25lKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2RpbmQoOCArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja196b25lczIodW5zaWduZWQgaSkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CgoJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCgkJcmV0dXJuOwoJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJCS8qIGhhdmUgd2UgY291bnRlZCB0aGlzIGZpbGUgYWxyZWFkeT8gKi8KCQlyZXR1cm47Cglpbm9kZSA9IElub2RlMiArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkKCQkmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQlyZXR1cm47Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQoJCWFkZF96b25lMihpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kMig3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZDIoOCArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX3RpbmQyKDkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19maWxlKHN0cnVjdCBtaW5peDFfaW5vZGUgKmRpciwgdW5zaWduZWQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVpbnQxNl90ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRmKCIlcyBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyUuKnMnLiAiLAoJCQkJY3VycmVudF9uYW1lLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCJSZW1vdmUiLCAxKSkgewoJCQkqKHVpbnQxNl90ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCXB1c2hfZmlsZW5hbWUobmFtZSk7Cglpbm9kZSA9IGdldF9pbm9kZShpbm8pOwoJcG9wX2ZpbGVuYW1lKCk7CglpZiAoIW9mZnNldCkgewoJCWlmIChpbm9kZSAmJiBMT05FX0NIQVIobmFtZSwgJy4nKSkKCQkJcmV0dXJuOwoJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKGlub2RlICYmIHN0cmNtcCgiLi4iLCBuYW1lKSA9PSAwKQoJCQlyZXR1cm47CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJcHVzaF9maWxlbmFtZShuYW1lKTsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludGYoIiVzJXNcbiIsIGN1cnJlbnRfbmFtZSwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSA/ICI6IiA6ICIiKTsKCX0KCWNoZWNrX3pvbmVzKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2soaW5vKTsKCXBvcF9maWxlbmFtZSgpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUyKHN0cnVjdCBtaW5peDJfaW5vZGUgKmRpciwgdW5zaWduZWQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrMihkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1aW50MTZfdCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50ZigiJXMgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICclLipzJy4gIiwKCQkJCWN1cnJlbnRfbmFtZSwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiUmVtb3ZlIiwgMSkpIHsKCQkJKih1aW50MTZfdCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglwdXNoX2ZpbGVuYW1lKG5hbWUpOwoJaW5vZGUgPSBnZXRfaW5vZGUyKGlubyk7Cglwb3BfZmlsZW5hbWUoKTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKGlub2RlICYmIExPTkVfQ0hBUihuYW1lLCAnLicpKQoJCQlyZXR1cm47CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglpZiAob2Zmc2V0ID09IGRpcnNpemUpIHsKCQlpZiAoaW5vZGUgJiYgc3RyY21wKCIuLiIsIG5hbWUpID09IDApCgkJCXJldHVybjsKCQlwcmludGYoIiVzOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIiwgY3VycmVudF9uYW1lKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJaWYgKCFpbm9kZSkKCQlyZXR1cm47CglwdXNoX2ZpbGVuYW1lKG5hbWUpOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOwoJfQoJY2hlY2tfem9uZXMyKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2syKGlubyk7Cglwb3BfZmlsZW5hbWUoKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbm8pCnsKCXN0cnVjdCBtaW5peDFfaW5vZGUgKmRpcjsKCXVuc2lnbmVkIG9mZnNldDsKCglkaXIgPSBJbm9kZTEgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLCBvZmZzZXQpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW5vKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXI7Cgl1bnNpZ25lZCBvZmZzZXQ7CgoJZGlyID0gSW5vZGUyICsgaW5vOwoJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKCQlkaWUoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6IHNpemU8MzIiLCBjdXJyZW50X25hbWUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGJhZF96b25lKGludCBpKQp7CgljaGFyIGJ1ZmZlcltCTE9DS19TSVpFXTsKCglpZiAoQkxPQ0tfU0laRSAqIGkgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOwp9CgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICh3YXJuX21vZGUgJiYgSW5vZGUxW2ldLmlfbW9kZSAmJiAhaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaGFzIG5vbi16ZXJvIG1vZGUuICIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZTFbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJVbnVzZWQgaW5vZGUgJWQgaXMgbWFya2VkIGFzICd1c2VkJyBpbiB0aGUgYml0bWFwLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgaXMgdXNlZCwgYnV0IG1hcmtlZCBhcyAndW51c2VkJyBpbiB0aGUgYml0bWFwLiAiLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGUxW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGU9JTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiAiLAoJCQkJaSwgSW5vZGUxW2ldLmlfbW9kZSwgSW5vZGUxW2ldLmlfbmxpbmtzLAoJCQkJaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGUxW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoKHpvbmVfaW5fdXNlKGkpICE9IDApID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQoKI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHMyKHZvaWQpCnsKCWludCBpOwoKCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKCQlpZiAod2Fybl9tb2RlICYmIElub2RlMltpXS5pX21vZGUgJiYgIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlMltpXS5pX25saW5rcyAhPSBpbm9kZV9jb3VudFtpXSkgewoJCQlwcmludGYoIklub2RlICVkIChtb2RlPSUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4gIiwKCQkJCWksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKCQkJCWlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQoJCQljb250aW51ZTsKCQlpZiAoIXpvbmVfY291bnRbaV0pIHsKCQkJaWYgKGJhZF96b25lKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiWm9uZSAlZCBpcyBtYXJrZWQgJ2luIHVzZScsIGJ1dCBubyBmaWxlIHVzZXMgaXQuICIsIGkpOwoJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKCQkJCXVubWFya196b25lKGkpOwoJCQljb250aW51ZTsKCQl9CgkJcHJpbnRmKCJab25lICVkOiAlc2luIHVzZSwgY291bnRlZD0lZFxuIiwKCQkJICAgaSwgem9uZV9pbl91c2UoaSkgPyAiIiA6ICJub3QgIiwgem9uZV9jb3VudFtpXSk7Cgl9Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVjayh2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMoTUlOSVhfUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrKE1JTklYX1JPT1RfSU5PKTsKCWNoZWNrX2NvdW50cygpOwp9CgojaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrMih2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMyKE1JTklYX1JPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjazIoTUlOSVhfUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzMigpOwp9CiNlbHNlCnZvaWQgY2hlY2syKHZvaWQpOwojZW5kaWYKCmludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCXN0cnVjdCB0ZXJtaW9zIHRtcDsKCWludCByZXRjb2RlID0gMDsKCgl4ZnVuY19lcnJvcl9yZXR2YWwgPSA4OwoKCWFsbG9jX2N1cnJlbnRfbmFtZSgpOwojaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKCS8qIERvbid0IGJvdGhlciB0byBmcmVlIG1lbW9yeS4gIEV4aXQgZG9lcwoJICogdGhhdCBhdXRvbWFnaWNhbGx5LCBzbyB3ZSBjYW4gc2F2ZSBhIGZldyBieXRlcyAqLwoJYXRleGl0KGZyZWVfY3VycmVudF9uYW1lKTsKI2VuZGlmCgoJaWYgKElOT0RFX1NJWkUxICogTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKCQlkaWUoImJhZCBpbm9kZSBzaXplIik7CiNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKCWlmIChJTk9ERV9TSVpFMiAqIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgdjIgaW5vZGUgc2l6ZSIpOwojZW5kaWYKCXdoaWxlICgtLWFyZ2MgIT0gMCkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKQoJCQkJYmJfc2hvd191c2FnZSgpOwoJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlIHsKCQkJd2hpbGUgKCorK2FyZ3ZbMF0pIHsKCQkJCXN3aXRjaCAoYXJndlswXVswXSkgewoJCQkJY2FzZSAnbCc6CgkJCQkJbGlzdCA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdhJzoKCQkJCQlhdXRvbWF0aWMgPSAxOwoJCQkJCXJlcGFpciA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdyJzoKCQkJCQlhdXRvbWF0aWMgPSAwOwoJCQkJCXJlcGFpciA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICd2JzoKCQkJCQl2ZXJib3NlID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3MnOgoJCQkJCXNob3cgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnbSc6CgkJCQkJd2Fybl9tb2RlID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2YnOgoJCQkJCWZvcmNlID0gMTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYmJfc2hvd191c2FnZSgpOwoJCQkJfQoJCQl9CgkJfQoJfQoJaWYgKCFkZXZpY2VfbmFtZSkKCQliYl9zaG93X3VzYWdlKCk7CgoJY2hlY2tfbW91bnQoKTsJCQkJLyogdHJ5aW5nIHRvIGNoZWNrIGEgbW91bnRlZCBmaWxlc3lzdGVtPyAqLwoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSkKCQkJZGllKCJuZWVkIHRlcm1pbmFsIGZvciBpbnRlcmFjdGl2ZSByZXBhaXJzIik7Cgl9CglJTiA9IHhvcGVuKGRldmljZV9uYW1lLCByZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSk7CgoJLypzeW5jKCk7IHBhcmFub2lhPyAqLwoJcmVhZF9zdXBlcmJsb2NrKCk7CgoJLyoKCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCgkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCgkgKiBmbGFncyBhbmQgd2hldGhlciBvciBub3QgdGhlIC1mIHN3aXRjaCB3YXMgc3BlY2lmaWVkIG9uIHRoZQoJICogY29tbWFuZCBsaW5lLgoJICovCglwcmludGYoIiVzLCAiUFJPR1JBTV9WRVJTSU9OIlxuIiwgYXBwbGV0X25hbWUpOwoKCWlmICghKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykKCSAmJiAoU3VwZXIuc19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSAmJiAhZm9yY2UKCSkgewoJCWlmIChyZXBhaXIpCgkJCXByaW50ZigiJXMgaXMgY2xlYW4sIGNoZWNrIGlzIHNraXBwZWRcbiIsIGRldmljZV9uYW1lKTsKCQlyZXR1cm4gMDsKCX0gZWxzZSBpZiAoZm9yY2UpCgkJcHJpbnRmKCJGb3JjaW5nIGZpbGVzeXN0ZW0gY2hlY2sgb24gJXNcbiIsIGRldmljZV9uYW1lKTsKCWVsc2UgaWYgKHJlcGFpcikKCQlwcmludGYoIkZpbGVzeXN0ZW0gb24gJXMgaXMgZGlydHksIG5lZWRzIGNoZWNraW5nXG4iLAoJCQkgICBkZXZpY2VfbmFtZSk7CgoJcmVhZF90YWJsZXMoKTsKCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpIHsKCQl0Y2dldGF0dHIoMCwgJnRlcm1pb3MpOwoJCXRtcCA9IHRlcm1pb3M7CgkJdG1wLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRtcCk7CgkJdGVybWlvc19zZXQgPSAxOwoJfQoKCWlmICh2ZXJzaW9uMikgewoJCWNoZWNrX3Jvb3QyKCk7CgkJY2hlY2syKCk7Cgl9IGVsc2UgewoJCWNoZWNrX3Jvb3QoKTsKCQljaGVjaygpOwoJfQoKCWlmICh2ZXJib3NlKSB7CgkJaW50IGksIGZyZWVfY250OwoKCQlmb3IgKGkgPSAxLCBmcmVlX2NudCA9IDA7IGkgPD0gSU5PREVTOyBpKyspCgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJZnJlZV9jbnQrKzsKCQlwcmludGYoIlxuJTZ1IGlub2RlcyB1c2VkICgldSUlKVxuIiwgKElOT0RFUyAtIGZyZWVfY250KSwKCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWVfY250KSAvIElOT0RFUyk7CgkJZm9yIChpID0gRklSU1RaT05FLCBmcmVlX2NudCA9IDA7IGkgPCBaT05FUzsgaSsrKQoJCQlpZiAoIXpvbmVfaW5fdXNlKGkpKQoJCQkJZnJlZV9jbnQrKzsKCQlwcmludGYoIiU2dSB6b25lcyB1c2VkICgldSUlKVxuXG4iCgkJCSAgICIlNnUgcmVndWxhciBmaWxlc1xuIgoJCQkgICAiJTZ1IGRpcmVjdG9yaWVzXG4iCgkJCSAgICIlNnUgY2hhcmFjdGVyIGRldmljZSBmaWxlc1xuIgoJCQkgICAiJTZ1IGJsb2NrIGRldmljZSBmaWxlc1xuIgoJCQkgICAiJTZ1IGxpbmtzXG4iCgkJCSAgICIlNnUgc3ltYm9saWMgbGlua3NcbiIKCQkJICAgIi0tLS0tLVxuIgoJCQkgICAiJTZ1IGZpbGVzXG4iLAoJCQkgICAoWk9ORVMgLSBmcmVlX2NudCksIDEwMCAqIChaT05FUyAtIGZyZWVfY250KSAvIFpPTkVTLAoJCQkgICByZWd1bGFyLCBkaXJlY3RvcnksIGNoYXJkZXYsIGJsb2NrZGV2LAoJCQkgICBsaW5rcyAtIDIgKiBkaXJlY3RvcnkgKyAxLCBzeW1saW5rcywKCQkJICAgdG90YWwgLSAyICogZGlyZWN0b3J5ICsgMSk7Cgl9CglpZiAoY2hhbmdlZCkgewoJCXdyaXRlX3RhYmxlcygpOwoJCXByaW50ZigiRklMRSBTWVNURU0gSEFTIEJFRU4gQ0hBTkdFRFxuIik7CgkJc3luYygpOwoJfSBlbHNlIGlmIChyZXBhaXIpCgkJd3JpdGVfc3VwZXJfYmxvY2soKTsKCglpZiAocmVwYWlyICYmICFhdXRvbWF0aWMpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCglpZiAoY2hhbmdlZCkKCQlyZXRjb2RlICs9IDM7CglpZiAoZXJyb3JzX3VuY29ycmVjdGVkKQoJCXJldGNvZGUgKz0gNDsKCXJldHVybiByZXRjb2RlOwp9Cg==