Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZXRhcnkgZnVuY3Rpb25zCiAqCiAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KICoJCVNlbnQgb3V0IHRvIHRoZSBtYWlsaW5nLWxpc3QgZm9yIHRlc3RpbmcuCiAqCiAqIDE0LjExLjkxICAtCVRlc3Rpbmcgc2VlbXMgdG8gaGF2ZSBnb25lIHdlbGwuIEFkZGVkIHNvbWUKICoJCWNvcnJlY3Rpb24tY29kZSwgYW5kIGNoYW5nZWQgc29tZSBmdW5jdGlvbnMuCiAqCiAqIDE1LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb24gY29kZS4gSG9wZWZ1bGx5IGl0IG5vdGljZXMgbW9zdAogKgkJY2FzZXMgbm93LCBhbmQgdHJpZXMgdG8gZG8gc29tZXRoaW5nIGFib3V0IHRoZW0uCiAqCiAqIDE2LjExLjkxICAtICBNb3JlIGNvcnJlY3Rpb25zICh0aGFua3MgdG8gTWlrYSBKYWxhdmEpLiBNb3N0CiAqCQl0aGluZ3Mgc2VlbSB0byB3b3JrIG5vdy4gWWVhaCwgc3VyZS4KICoKICoKICogMTkuMDQuOTIgIC0JSGFkIHRvIHN0YXJ0IG92ZXIgYWdhaW4gZnJvbSB0aGlzIG9sZCB2ZXJzaW9uLCBhcyBhCiAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgogKgogKiAyOC4wMi45MyAgLQlhZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGlyZWN0b3J5IGVudHJ5IHNpemVzLi4KICoKICogU2F0IE1hciAgNiAxODo1OTo0MiAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBPdXRwdXQgbmFtZWxlbiB3aXRoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXItYmxvY2sgaW5mb3JtYXRpb24KICoKICogU2F0IE9jdCAgOSAxMToxNzoxMSAxOTkzLCBmYWl0aEBjcy51bmMuZWR1OiBtYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0KICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGF0IHJlcXVpcmVkIGJ5IGZzdXRpbAogKgogKiBNb24gSmFuICAzIDExOjA2OjUyIDE5OTQgLSBEci4gV2V0dHN0ZWluIChncmVnJXdpbmQudXVjcEBwbGFpbnMubm9kYWsuZWR1KQogKgkJCSAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCiAqCQkJICAgICAgYWRkZWQgcHJvZ3JhbV92ZXJzaW9uIHZhcmlhYmxlIGFuZCBvdXRwdXQgb2YKICoJCQkgICAgICBwcm9ncmFtIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdoZW4gcHJvZ3JhbQogKgkJCSAgICAgIGlzIGV4ZWN1dGVkLgogKgogKiAzMC4xMC45NCAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KICogICAgICAgICAgICAoQW5kcmVhcyBTY2h3YWIsIHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSkKICoKICogMTAuMTIuOTQgIC0gIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKICogICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCiAqICAgICAgICAgICAgICBwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCiAqCiAqIDAxLjA3Ljk2ICAtIEZpeGVkIHRoZSB2MiBmcyBzdHVmZiB0byB1c2UgdGhlIHJpZ2h0ICNkZWZpbmVzIGFuZCBzdWNoCiAqCSAgICAgICBmb3IgbW9kZXJuIGxpYmNzIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDIuMDcuOTYgIC0gQWRkZWQgQyBiaXQgZmlkZGxpbmcgcm91dGluZXMgZnJvbSBybWtAZWNzLnNvdG9uLmFjLnVrIAogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW1pbmRlcGVuZGVudC4KICoJICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKICoKICogMDQuMTEuOTYgIC0gQWRkZWQgbWlub3IgZml4ZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiB0byBhdm9pZCBjb21waWxlcgogKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tIAogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzdWFnZTogZnNjayBbLWxhcnZzbV0gZGV2aWNlCiAqCS1sIGZvciBhIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlbmFtZXMKICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCiAqCS1yIGZvciByZXBhaXJzIChpbnRlcmFjdGl2ZSkgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXYgZm9yIHZlcmJvc2UgKHRlbGxzIGhvdyBtYW55IGZpbGVzKQogKgktcyBmb3Igc3VwZXItYmxvY2sgaW5mbwogKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKICoJLWYgZm9yY2UgZmlsZXN5c3RlbSBjaGVjayBldmVuIGlmIGZpbGVzeXN0ZW0gbWFya2VkIGFzIHZhbGlkCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuIAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dGVybWlvcy5oPgojaW5jbHVkZSA8bW50ZW50Lmg+CiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgImJ1c3lib3guaCIKCiAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7CnR5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKCgpzdGF0aWMgY29uc3QgaW50IE1JTklYX1JPT1RfSU5PID0gMTsKc3RhdGljIGNvbnN0IGludCBNSU5JWF9MSU5LX01BWCA9IDI1MDsKc3RhdGljIGNvbnN0IGludCBNSU5JWDJfTElOS19NQVggPSA2NTUzMDsKCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfSV9NQVBfU0xPVFMgPSA4OwpzdGF0aWMgY29uc3QgaW50IE1JTklYX1pfTUFQX1NMT1RTID0gNjQ7CnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfU1VQRVJfTUFHSUMgPSAweDEzN0Y7CQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwpzdGF0aWMgY29uc3QgaW50IE1JTklYX1NVUEVSX01BR0lDMiA9IDB4MTM4RjsJCS8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCnN0YXRpYyBjb25zdCBpbnQgTUlOSVgyX1NVUEVSX01BR0lDID0gMHgyNDY4OwkJLyogbWluaXggVjIgZnMgKi8Kc3RhdGljIGNvbnN0IGludCBNSU5JWDJfU1VQRVJfTUFHSUMyID0gMHgyNDc4OwkJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8Kc3RhdGljIGNvbnN0IGludCBNSU5JWF9WQUxJRF9GUyA9IDB4MDAwMTsJCS8qIENsZWFuIGZzLiAqLwpzdGF0aWMgY29uc3QgaW50IE1JTklYX0VSUk9SX0ZTID0gMHgwMDAyOwkJLyogZnMgaGFzIGVycm9ycy4gKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQojZGVmaW5lIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4Ml9pbm9kZSkpKQoKc3RhdGljIGNvbnN0IGludCBNSU5JWF9WMSA9IDB4MDAwMTsJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfVjIgPSAweDAwMDI7CQkvKiBtaW5peCBWMiBmcyAqLwoKI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQlpbm9kZS0+aV9zYi0+dS5taW5peF9zYi5zX3ZlcnNpb24KCi8qCiAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIG1pbml4IGlub2RlIGxheW91dCBvbiBkaXNrLgogKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KICovCnN0cnVjdCBtaW5peF9pbm9kZSB7Cgl1MTYgaV9tb2RlOwoJdTE2IGlfdWlkOwoJdTMyIGlfc2l6ZTsKCXUzMiBpX3RpbWU7Cgl1OCAgaV9naWQ7Cgl1OCAgaV9ubGlua3M7Cgl1MTYgaV96b25lWzldOwp9OwoKLyoKICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKICogbG9uZyBibG9jayBudW1iZXJzIGFuZCBhIHRoaXJkIGluZGlyZWN0IGJsb2NrICg3KzErMSsxCiAqIGluc3RlYWQgb2YgNysxKzEpLiBBbHNvLCBzb21lIHByZXZpb3VzbHkgOC1iaXQgdmFsdWVzIGFyZQogKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCiAqLwpzdHJ1Y3QgbWluaXgyX2lub2RlIHsKCXUxNiBpX21vZGU7Cgl1MTYgaV9ubGlua3M7Cgl1MTYgaV91aWQ7Cgl1MTYgaV9naWQ7Cgl1MzIgaV9zaXplOwoJdTMyIGlfYXRpbWU7Cgl1MzIgaV9tdGltZTsKCXUzMiBpX2N0aW1lOwoJdTMyIGlfem9uZVsxMF07Cn07CgovKgogKiBtaW5peCBzdXBlci1ibG9jayBkYXRhIG9uIGRpc2sKICovCnN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayB7Cgl1MTYgc19uaW5vZGVzOwoJdTE2IHNfbnpvbmVzOwoJdTE2IHNfaW1hcF9ibG9ja3M7Cgl1MTYgc196bWFwX2Jsb2NrczsKCXUxNiBzX2ZpcnN0ZGF0YXpvbmU7Cgl1MTYgc19sb2dfem9uZV9zaXplOwoJdTMyIHNfbWF4X3NpemU7Cgl1MTYgc19tYWdpYzsKCXUxNiBzX3N0YXRlOwoJdTMyIHNfem9uZXM7Cn07CgpzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKCXUxNiBpbm9kZTsKCWNoYXIgbmFtZVswXTsKfTsKCiNkZWZpbmUgQkxPQ0tfU0laRV9CSVRTIDEwCiNkZWZpbmUgQkxPQ0tfU0laRSAoMTw8QkxPQ0tfU0laRV9CSVRTKQoKI2RlZmluZSBOQU1FX01BWCAgICAgICAgIDI1NSAgIC8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQoKI2lmbmRlZiBCTEtHRVRTSVpFCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikgICAgLyogcmV0dXJuIGRldmljZSBzaXplICovCiNlbmRpZgoKI2lmbmRlZiBfX2xpbnV4X18KI2RlZmluZSB2b2xhdGlsZQojZW5kaWYKCnN0YXRpYyBjb25zdCBpbnQgUk9PVF9JTk8gPSAxOwoKI2RlZmluZSBVUFBFUihzaXplLG4pICgoc2l6ZSsoKG4pLTEpKS8obikpCiNkZWZpbmUgSU5PREVfU0laRSAoc2l6ZW9mKHN0cnVjdCBtaW5peF9pbm9kZSkpCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgojZGVmaW5lIElOT0RFX1NJWkUyIChzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSkpCiNkZWZpbmUgSU5PREVfQkxPQ0tTIFVQUEVSKElOT0RFUywgKHZlcnNpb24yID8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0sgXAoJCQkJICAgIDogTUlOSVhfSU5PREVTX1BFUl9CTE9DSykpCiNlbHNlCiNkZWZpbmUgSU5PREVfQkxPQ0tTIFVQUEVSKElOT0RFUywgKE1JTklYX0lOT0RFU19QRVJfQkxPQ0spKQojZW5kaWYKI2RlZmluZSBJTk9ERV9CVUZGRVJfU0laRSAoSU5PREVfQkxPQ0tTICogQkxPQ0tfU0laRSkKCiNkZWZpbmUgQklUU19QRVJfQkxPQ0sgKEJMT0NLX1NJWkU8PDMpCgpzdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjEuMiAtIDExLzExLzk2IjsKc3RhdGljIGNoYXIgKmRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBJTjsKc3RhdGljIGludCByZXBhaXIgPSAwLCBhdXRvbWF0aWMgPSAwLCB2ZXJib3NlID0gMCwgbGlzdCA9IDAsIHNob3cgPQoJMCwgd2Fybl9tb2RlID0gMCwgZm9yY2UgPSAwOwpzdGF0aWMgaW50IGRpcmVjdG9yeSA9IDAsIHJlZ3VsYXIgPSAwLCBibG9ja2RldiA9IDAsIGNoYXJkZXYgPSAwLCBsaW5rcyA9CgkwLCBzeW1saW5rcyA9IDAsIHRvdGFsID0gMDsKCnN0YXRpYyBpbnQgY2hhbmdlZCA9IDA7CQkJLyogZmxhZ3MgaWYgdGhlIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqLwpzdGF0aWMgaW50IGVycm9yc191bmNvcnJlY3RlZCA9IDA7CS8qIGZsYWcgaWYgc29tZSBlcnJvciB3YXMgbm90IGNvcnJlY3RlZCAqLwpzdGF0aWMgaW50IGRpcnNpemUgPSAxNjsKc3RhdGljIGludCBuYW1lbGVuID0gMTQ7CnN0YXRpYyBpbnQgdmVyc2lvbjIgPSAwOwpzdGF0aWMgc3RydWN0IHRlcm1pb3MgdGVybWlvczsKc3RhdGljIGludCB0ZXJtaW9zX3NldCA9IDA7CgovKiBGaWxlLW5hbWUgZGF0YSAqLwpzdGF0aWMgY29uc3QgaW50IE1BWF9ERVBUSCA9IDMyOwpzdGF0aWMgaW50IG5hbWVfZGVwdGggPSAwOwovLyBzdGF0aWMgY2hhciBuYW1lX2xpc3RbTUFYX0RFUFRIXVtCVUZTSVogKyAxXTsKc3RhdGljIGNoYXIgKipuYW1lX2xpc3QgPSBOVUxMOwoKc3RhdGljIGNoYXIgKmlub2RlX2J1ZmZlciA9IE5VTEw7CgojZGVmaW5lIElub2RlICgoKHN0cnVjdCBtaW5peF9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCiNkZWZpbmUgSW5vZGUyICgoKHN0cnVjdCBtaW5peDJfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQpzdGF0aWMgY2hhciBzdXBlcl9ibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CgojZGVmaW5lIFN1cGVyICgqKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKXN1cGVyX2Jsb2NrX2J1ZmZlcikKI2RlZmluZSBJTk9ERVMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbmlub2RlcykKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKSh2ZXJzaW9uMiA/IFN1cGVyLnNfem9uZXMgOiBTdXBlci5zX256b25lcykpCiNlbHNlCiNkZWZpbmUgWk9ORVMgKCh1bnNpZ25lZCBsb25nKShTdXBlci5zX256b25lcykpCiNlbmRpZgojZGVmaW5lIElNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ltYXBfYmxvY2tzKQojZGVmaW5lIFpNQVBTICgodW5zaWduZWQgbG9uZylTdXBlci5zX3ptYXBfYmxvY2tzKQojZGVmaW5lIEZJUlNUWk9ORSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19maXJzdGRhdGF6b25lKQojZGVmaW5lIFpPTkVTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX2xvZ196b25lX3NpemUpCiNkZWZpbmUgTUFYU0laRSAoKHVuc2lnbmVkIGxvbmcpU3VwZXIuc19tYXhfc2l6ZSkKI2RlZmluZSBNQUdJQyAoU3VwZXIuc19tYWdpYykKI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAoMitJTUFQUytaTUFQUytJTk9ERV9CTE9DS1MpCgpzdGF0aWMgY2hhciAqaW5vZGVfbWFwOwpzdGF0aWMgY2hhciAqem9uZV9tYXA7CgpzdGF0aWMgdW5zaWduZWQgY2hhciAqaW5vZGVfY291bnQgPSBOVUxMOwpzdGF0aWMgdW5zaWduZWQgY2hhciAqem9uZV9jb3VudCA9IE5VTEw7CgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubyk7CiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGludCBpbm8pOwojZW5kaWYKCnN0YXRpYyBpbmxpbmUgaW50IGJpdChjaGFyICogYSx1bnNpZ25lZCBpbnQgaSkKewoJICByZXR1cm4gKGFbaSA+PiAzXSAmICgxPDwoaSAmIDcpKSkgIT0gMDsKfQojZGVmaW5lIGlub2RlX2luX3VzZSh4KSAoYml0KGlub2RlX21hcCwoeCkpKQojZGVmaW5lIHpvbmVfaW5fdXNlKHgpIChiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKCiNkZWZpbmUgbWFya19pbm9kZSh4KSAoc2V0Yml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKI2RlZmluZSB1bm1hcmtfaW5vZGUoeCkgKGNscmJpdChpbm9kZV9tYXAsKHgpKSxjaGFuZ2VkPTEpCgojZGVmaW5lIG1hcmtfem9uZSh4KSAoc2V0Yml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya196b25lKHgpIChjbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCgpzdGF0aWMgdm9pZCBsZWF2ZShpbnQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwpzdGF0aWMgdm9pZCBsZWF2ZShpbnQgc3RhdHVzKQp7CglpZiAodGVybWlvc19zZXQpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCWV4aXQoc3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJZXJyb3JfbXNnKCIlcyIsIHN0cik7CglsZWF2ZSg4KTsKfQoKLyoKICogVGhpcyBzaW1wbHkgZ29lcyB0aHJvdWdoIHRoZSBmaWxlLW5hbWUgZGF0YSBhbmQgcHJpbnRzIG91dCB0aGUKICogY3VycmVudCBmaWxlLgogKi8Kc3RhdGljIHZvaWQgcHJpbnRfY3VycmVudF9uYW1lKHZvaWQpCnsKCWludCBpID0gMDsKCgl3aGlsZSAoaSA8IG5hbWVfZGVwdGgpCgkJcHJpbnRmKCIvJS4qcyIsIG5hbWVsZW4sIG5hbWVfbGlzdFtpKytdKTsKCWlmIChpID09IDApCgkJcHJpbnRmKCIvIik7Cn0KCnN0YXRpYyBpbnQgYXNrKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGRlZikKewoJaW50IGM7CgoJaWYgKCFyZXBhaXIpIHsKCQlwcmludGYoIlxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gMDsKCX0KCWlmIChhdXRvbWF0aWMpIHsKCQlwcmludGYoIlxuIik7CgkJaWYgKCFkZWYpCgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuIGRlZjsKCX0KCXByaW50ZihkZWYgPyAiJXMgKHkvbik/ICIgOiAiJXMgKG4veSk/ICIsIHN0cmluZyk7Cglmb3IgKDs7KSB7CgkJZmZsdXNoKHN0ZG91dCk7CgkJaWYgKChjID0gZ2V0Y2hhcigpKSA9PSBFT0YpIHsKCQkJaWYgKCFkZWYpCgkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQlyZXR1cm4gZGVmOwoJCX0KCQljID0gdG91cHBlcihjKTsKCQlpZiAoYyA9PSAnWScpIHsKCQkJZGVmID0gMTsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICdOJykgewoJCQlkZWYgPSAwOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJykKCQkJYnJlYWs7Cgl9CglpZiAoZGVmKQoJCXByaW50ZigieVxuIik7CgllbHNlIHsKCQlwcmludGYoIm5cbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gZGVmOwp9CgovKgogKiBNYWtlIGNlcnRhaW4gdGhhdCB3ZSBhcmVuJ3QgY2hlY2tpbmcgYSBmaWxlc3lzdGVtIHRoYXQgaXMgb24gYQogKiBtb3VudGVkIHBhcnRpdGlvbi4gIENvZGUgYWRhcHRlZCBmcm9tIGUyZnNjaywgQ29weXJpZ2h0IChDKSAxOTkzLAogKiAxOTk0IFRoZW9kb3JlIFRzJ28uICBBbHNvIGxpY2Vuc2VkIHVuZGVyIEdQTC4KICovCnN0YXRpYyB2b2lkIGNoZWNrX21vdW50KHZvaWQpCnsKCUZJTEUgKmY7CglzdHJ1Y3QgbW50ZW50ICptbnQ7CglpbnQgY29udDsKCWludCBmZDsKCglpZiAoKGYgPSBzZXRtbnRlbnQoTU9VTlRFRCwgInIiKSkgPT0gTlVMTCkKCQlyZXR1cm47Cgl3aGlsZSAoKG1udCA9IGdldG1udGVudChmKSkgIT0gTlVMTCkKCQlpZiAoc3RyY21wKGRldmljZV9uYW1lLCBtbnQtPm1udF9mc25hbWUpID09IDApCgkJCWJyZWFrOwoJZW5kbW50ZW50KGYpOwoJaWYgKCFtbnQpCgkJcmV0dXJuOwoKCS8qCgkgKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQtb25seSwgdGhlbiAvZXRjL210YWIgaXMKCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KCSAqIGl0LgoJICovCglmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSKTsKCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCgkJcmV0dXJuOwoJZWxzZQoJCWNsb3NlKGZkKTsKCglwcmludGYoIiVzIGlzIG1vdW50ZWQuCSAiLCBkZXZpY2VfbmFtZSk7CglpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKCWVsc2UKCQljb250ID0gMDsKCWlmICghY29udCkgewoJCXByaW50ZigiY2hlY2sgYWJvcnRlZC5cbiIpOwoJCWV4aXQoMCk7Cgl9CglyZXR1cm47Cn0KCi8qCiAqIGNoZWNrX3pvbmVfbnIgY2hlY2tzIHRvIHNlZSB0aGF0ICpuciBpcyBhIHZhbGlkIHpvbmUgbnIuIElmIGl0CiAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAogKiBpZiBhbiBlcnJvciB3YXMgY29ycmVjdGVkLCBhbmQgcmV0dXJucyB0aGUgem9uZSAoMCBmb3Igbm8gem9uZQogKiBvciBhIGJhZCB6b25lLW51bWJlcikuCiAqLwpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIodW5zaWduZWQgc2hvcnQgKm5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCXByaW50ZigiWm9uZSBuciA8IEZJUlNUWk9ORSBpbiBmaWxlIGAiKTsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQlwcmludGYoIlpvbmUgbnIgPj0gWk9ORVMgaW4gZmlsZSBgIik7CgllbHNlCgkJcmV0dXJuICpucjsKCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJcHJpbnRmKCInLiIpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIyKHVuc2lnbmVkIGludCAqbnIsIGludCAqY29ycmVjdGVkKQp7CglpZiAoISpucikKCQlyZXR1cm4gMDsKCWlmICgqbnIgPCBGSVJTVFpPTkUpCgkJcHJpbnRmKCJab25lIG5yIDwgRklSU1RaT05FIGluIGZpbGUgYCIpOwoJZWxzZSBpZiAoKm5yID49IFpPTkVTKQoJCXByaW50ZigiWm9uZSBuciA+PSBaT05FUyBpbiBmaWxlIGAiKTsKCWVsc2UKCQlyZXR1cm4gKm5yOwoJcHJpbnRfY3VycmVudF9uYW1lKCk7CglwcmludGYoIicuIik7CglpZiAoYXNrKCJSZW1vdmUgYmxvY2siLCAxKSkgewoJCSpuciA9IDA7CgkJKmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIHJlYWQtYmxvY2sgcmVhZHMgYmxvY2sgbnIgaW50byB0aGUgYnVmZmVyIGF0IGFkZHIuCiAqLwpzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikgewoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogdW5hYmxlIHRvIHNlZWsgdG8gYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0gZWxzZSBpZiAoQkxPQ0tfU0laRSAhPSByZWFkKElOLCBhZGRyLCBCTE9DS19TSVpFKSkgewoJCXByaW50ZigiUmVhZCBlcnJvcjogYmFkIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cn0KCi8qCiAqIHdyaXRlX2Jsb2NrIHdyaXRlcyBibG9jayBuciB0byBkaXNrLgogKi8Kc3RhdGljIHZvaWQgd3JpdGVfYmxvY2sodW5zaWduZWQgaW50IG5yLCBjaGFyICphZGRyKQp7CglpZiAoIW5yKQoJCXJldHVybjsKCWlmIChuciA8IEZJUlNUWk9ORSB8fCBuciA+PSBaT05FUykgewoJCXByaW50ZigiSW50ZXJuYWwgZXJyb3I6IHRyeWluZyB0byB3cml0ZSBiYWQgYmxvY2tcbiIKCQkJICAgIldyaXRlIHJlcXVlc3QgaWdub3JlZFxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm47Cgl9CglpZiAoQkxPQ0tfU0laRSAqIG5yICE9IGxzZWVrKElOLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIldyaXRlIGVycm9yOiBiYWQgYmxvY2sgaW4gZmlsZSAnIik7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCInXG4iKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiBtYXAtYmxvY2sgY2FsY3VsYXRlcyB0aGUgYWJzb2x1dGUgYmxvY2sgbnIgb2YgYSBibG9jayBpbiBhIGZpbGUuCiAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCiAqIGFueSBpbmRpcmVjdCBibG9ja3Mgd2l0aCBlcnJvcnMuCiAqLwpzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgYmxrbnIpCnsKCXVuc2lnbmVkIHNob3J0IGluZFtCTE9DS19TSVpFID4+IDFdOwoJdW5zaWduZWQgc2hvcnQgZGluZFtCTE9DS19TSVpFID4+IDFdOwoJaW50IGJsa19jaGcsIGJsb2NrLCByZXN1bHQ7CgoJaWYgKGJsa25yIDwgNykKCQlyZXR1cm4gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCA1MTIpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoYmxrbnIgKyBpbmQsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDUxMjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoZGluZCArIChibGtuciAvIDUxMiksICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucihpbmQgKyAoYmxrbnIgJSA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCXJldHVybiByZXN1bHQ7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IG1hcF9ibG9jazIoc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBibGtucikKewoJdW5zaWduZWQgaW50IGluZFtCTE9DS19TSVpFID4+IDJdOwoJdW5zaWduZWQgaW50IGRpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCXVuc2lnbmVkIGludCB0aW5kW0JMT0NLX1NJWkUgPj4gMl07CglpbnQgYmxrX2NoZywgYmxvY2ssIHJlc3VsdDsKCglpZiAoYmxrbnIgPCA3KQoJCXJldHVybiBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgYmxrbnIsICZjaGFuZ2VkKTsKCWJsa25yIC09IDc7CglpZiAoYmxrbnIgPCAyNTYpIHsKCQlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihibGtuciArIGluZCwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2OwoJaWYgKGJsa25yID49IDI1NiAqIDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgYmxrbnIgLyAyNTYsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsb2NrID0gcmVzdWx0OwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJYmxrX2NoZyA9IDA7CgkJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoaW5kICsgYmxrbnIgJSAyNTYsICZibGtfY2hnKTsKCQlpZiAoYmxrX2NoZykKCQkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CgkJcmV0dXJuIHJlc3VsdDsKCX0KCWJsa25yIC09IDI1NiAqIDI1NjsKCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDksICZjaGFuZ2VkKTsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIHRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMih0aW5kICsgYmxrbnIgLyAoMjU2ICogMjU2KSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIHRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoZGluZCArIChibGtuciAvIDI1NikgJSAyNTYsICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBkaW5kKTsKCWJsb2NrID0gcmVzdWx0OwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCWJsa19jaGcgPSAwOwoJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoaW5kICsgYmxrbnIgJSAyNTYsICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJcmV0dXJuIHJlc3VsdDsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIHdyaXRlX3N1cGVyX2Jsb2NrKHZvaWQpCnsKCS8qCgkgKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBmaWxlc3lzdGVtIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZXJlCgkgKiBhcmUgdW5jb3JyZWN0ZWQgZXJyb3JzLiAgVGhlIGZpbGVzeXN0ZW0gdmFsaWQgZmxhZyBpcwoJICogdW5jb25kaXRpb25hbGx5IHNldCBpZiB3ZSBnZXQgdGhpcyBmYXIuCgkgKi8KCVN1cGVyLnNfc3RhdGUgfD0gTUlOSVhfVkFMSURfRlM7CglpZiAoZXJyb3JzX3VuY29ycmVjdGVkKQoJCVN1cGVyLnNfc3RhdGUgfD0gTUlOSVhfRVJST1JfRlM7CgllbHNlCgkJU3VwZXIuc19zdGF0ZSAmPSB+TUlOSVhfRVJST1JfRlM7CgoJaWYgKEJMT0NLX1NJWkUgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUsIFNFRUtfU0VUKSkKCQlkaWUoInNlZWsgZmFpbGVkIGluIHdyaXRlX3N1cGVyX2Jsb2NrIik7CglpZiAoQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgc3VwZXJfYmxvY2tfYnVmZmVyLCBCTE9DS19TSVpFKSkKCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzdXBlci1ibG9jayIpOwoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQgd3JpdGVfdGFibGVzKHZvaWQpCnsKCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfbWFwLCBJTUFQUyAqIEJMT0NLX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgem9uZSBtYXAiKTsKCWlmIChJTk9ERV9CVUZGRVJfU0laRSAhPSB3cml0ZShJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGVzIik7Cn0KCnN0YXRpYyB2b2lkIGdldF9kaXJzaXplKHZvaWQpCnsKCWludCBibG9jazsKCWNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IHNpemU7CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCWlmICh2ZXJzaW9uMikKCQlibG9jayA9IElub2RlMltST09UX0lOT10uaV96b25lWzBdOwoJZWxzZQojZW5kaWYKCQlibG9jayA9IElub2RlW1JPT1RfSU5PXS5pX3pvbmVbMF07CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChzaXplID0gMTY7IHNpemUgPCBCTE9DS19TSVpFOyBzaXplIDw8PSAxKSB7CgkJaWYgKHN0cmNtcChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgewoJCQlkaXJzaXplID0gc2l6ZTsKCQkJbmFtZWxlbiA9IHNpemUgLSAyOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogdXNlIGRlZmF1bHRzICovCn0KCnN0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQp7CglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQiKTsKCWlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJ1bmFibGUgdG8gcmVhZCBzdXBlciBibG9jayIpOwoJaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDA7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAwOwojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDE7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKCQluYW1lbGVuID0gMzA7CgkJZGlyc2l6ZSA9IDMyOwoJCXZlcnNpb24yID0gMTsKI2VuZGlmCgl9IGVsc2UKCQlkaWUoImJhZCBtYWdpYyBudW1iZXIgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaT05FU0laRSAhPSAwIHx8IEJMT0NLX1NJWkUgIT0gMTAyNCkKCQlkaWUoIk9ubHkgMWsgYmxvY2tzL3pvbmVzIHN1cHBvcnRlZCIpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAqIDggPCBJTk9ERVMgKyAxKQoJCWRpZSgiYmFkIHNfaW1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgWk9ORVMgLSBGSVJTVFpPTkUgKyAxKQoJCWRpZSgiYmFkIHNfem1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXItYmxvY2siKTsKfQoKc3RhdGljIHZvaWQgcmVhZF90YWJsZXModm9pZCkKewoJaW5vZGVfbWFwID0geG1hbGxvYyhJTUFQUyAqIEJMT0NLX1NJWkUpOwoJem9uZV9tYXAgPSB4bWFsbG9jKFpNQVBTICogQkxPQ0tfU0laRSk7CgltZW1zZXQoaW5vZGVfbWFwLCAwLCBzaXplb2YoaW5vZGVfbWFwKSk7CgltZW1zZXQoem9uZV9tYXAsIDAsIHNpemVvZih6b25lX21hcCkpOwoJaW5vZGVfYnVmZmVyID0geG1hbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7Cglpbm9kZV9jb3VudCA9IHhtYWxsb2MoSU5PREVTICsgMSk7Cgl6b25lX2NvdW50ID0geG1hbGxvYyhaT05FUyk7CglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHJlYWQoSU4sIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIGlub2RlIG1hcCIpOwoJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byByZWFkIHpvbmUgbWFwIik7CglpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gcmVhZChJTiwgaW5vZGVfYnVmZmVyLCBJTk9ERV9CVUZGRVJfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZXMiKTsKCWlmIChOT1JNX0ZJUlNUWk9ORSAhPSBGSVJTVFpPTkUpIHsKCQlwcmludGYoIldhcm5pbmc6IEZpcnN0em9uZSAhPSBOb3JtX2ZpcnN0em9uZVxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWdldF9kaXJzaXplKCk7CglpZiAoc2hvdykgewoJCXByaW50ZigiJWxkIGlub2Rlc1xuIiwgSU5PREVTKTsKCQlwcmludGYoIiVsZCBibG9ja3NcbiIsIFpPTkVTKTsKCQlwcmludGYoIkZpcnN0ZGF0YXpvbmU9JWxkICglbGQpXG4iLCBGSVJTVFpPTkUsIE5PUk1fRklSU1RaT05FKTsKCQlwcmludGYoIlpvbmVzaXplPSVkXG4iLCBCTE9DS19TSVpFIDw8IFpPTkVTSVpFKTsKCQlwcmludGYoIk1heHNpemU9JWxkXG4iLCBNQVhTSVpFKTsKCQlwcmludGYoIkZpbGVzeXN0ZW0gc3RhdGU9JWRcbiIsIFN1cGVyLnNfc3RhdGUpOwoJCXByaW50ZigibmFtZWxlbj0lZFxuXG4iLCBuYW1lbGVuKTsKCX0KfQoKc3RhdGljIHN0cnVjdCBtaW5peF9pbm9kZSAqZ2V0X2lub2RlKHVuc2lnbmVkIGludCBucikKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCInXG4iKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJfSBlbHNlIHsKCQkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJCWRpcmVjdG9yeSsrOwoJCWVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCgkJCXJlZ3VsYXIrKzsKCQllbHNlIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpKQoJCQljaGFyZGV2Kys7CgkJZWxzZSBpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKCQkJYmxvY2tkZXYrKzsKCQllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCQlzeW1saW5rcysrOwoJCWVsc2UgaWYgKFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIGlmIChTX0lTRklGTyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIiBoYXMgbW9kZSAlMDVvXG4iLCBpbm9kZS0+aV9tb2RlKTsKCQl9CgoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWcuXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHN0cnVjdCBtaW5peDJfaW5vZGUgKmdldF9pbm9kZTIodW5zaWduZWQgaW50IG5yKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIW5yIHx8IG5yID4gSU5PREVTKQoJCXJldHVybiBOVUxMOwoJdG90YWwrKzsKCWlub2RlID0gSW5vZGUyICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIG1hcmtlZCBub3QgdXNlZCwgYnV0IHVzZWQgZm9yIGZpbGUgJyIsIG5yKTsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiJ1xuIik7CgkJCWlmIChyZXBhaXIpIHsKCQkJCWlmIChhc2soIk1hcmsgaW4gdXNlIiwgMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCQllbHNlCgkJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQkJfQoJCX0KCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJZGlyZWN0b3J5Kys7CgkJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKCQkJcmVndWxhcisrOwoJCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCgkJCWNoYXJkZXYrKzsKCQllbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpKQoJCQlibG9ja2RldisrOwoJCWVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCgkJCXN5bWxpbmtzKys7CgkJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgaWYgKFNfSVNGSUZPKGlub2RlLT5pX21vZGUpKTsKCQllbHNlIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiIGhhcyBtb2RlICUwNW9cbiIsIGlub2RlLT5pX21vZGUpOwoJCX0KCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnLlxuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3Qodm9pZCkKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZSA9IElub2RlICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYWRkX3pvbmUodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJCbG9jayBoYXMgYmVlbiB1c2VkIGJlZm9yZS4gTm93IGluIGZpbGUgYCIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJy4iKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJyBpcyBtYXJrZWQgbm90IGluIHVzZS4iKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgYWRkX3pvbmUyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaW50IHJlc3VsdDsKCWludCBibG9jazsKCglyZXN1bHQgPSAwOwoJYmxvY2sgPSBjaGVja196b25lX25yMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJCbG9jayBoYXMgYmVlbiB1c2VkIGJlZm9yZS4gTm93IGluIGZpbGUgYCIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJy4iKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJyBpcyBtYXJrZWQgbm90IGluIHVzZS4iKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1bnNpZ25lZCBzaG9ydCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IChCTE9DS19TSVpFID4+IDEpOyBpKyspCgkJYWRkX3pvbmUoaSArICh1bnNpZ25lZCBzaG9ydCAqKSBibGssICZjaGdfYmxrKTsKCWlmIChjaGdfYmxrKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBjaGdfYmxrID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCgkJYWRkX3pvbmUyKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmNoZ19ibGspOwoJaWYgKGNoZ19ibGspCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kKHVuc2lnbmVkIHNob3J0ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybjsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7Cglmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKCQlhZGRfem9uZV9pbmQoaSArICh1bnNpZ25lZCBzaG9ydCAqKSBibGssICZibGtfY2hnKTsKCWlmIChibGtfY2hnKQoJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2luZDIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKc3RhdGljIHZvaWQgYWRkX3pvbmVfdGluZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2RpbmQyKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja196b25lcyh1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCgkJIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZCg3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfem9uZXMyKHVuc2lnbmVkIGludCBpKQp7CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUyICsgaTsKCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQoJCSYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQoJCXJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUyKGkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9pbmQyKDcgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7CglhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfdGluZDIoOSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrX2ZpbGUoc3RydWN0IG1pbml4X2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CglpbnQgaW5vOwoJY2hhciAqbmFtZTsKCWludCBibG9jazsKCglibG9jayA9IG1hcF9ibG9jayhkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnIik7CgkJcHJpbnRmKCIlLipzJy4iLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCIgUmVtb3ZlIiwgMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7Cglpbm9kZSA9IGdldF9pbm9kZShpbm8pOwoJbmFtZV9kZXB0aC0tOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlwcmludGYoIjpcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMoaW5vKTsKCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCXJlY3Vyc2l2ZV9jaGVjayhpbm8pOwoJbmFtZV9kZXB0aC0tOwoJcmV0dXJuOwp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfZmlsZTIoc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZTsKCWludCBpbm87CgljaGFyICpuYW1lOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gbWFwX2Jsb2NrMihkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCW5hbWUgPSBibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOwoJaW5vID0gKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpOwoJaWYgKGlubyA+IElOT0RFUykgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnIik7CgkJcHJpbnRmKCIlLipzJy4iLCBuYW1lbGVuLCBuYW1lKTsKCQlpZiAoYXNrKCIgUmVtb3ZlIiwgMSkpIHsKCQkJKih1bnNpZ25lZCBzaG9ydCAqKSAobmFtZSAtIDIpID0gMDsKCQkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7CgkJfQoJCWlubyA9IDA7Cgl9CglpZiAobmFtZV9kZXB0aCA8IE1BWF9ERVBUSCkKCQlzdHJuY3B5KG5hbWVfbGlzdFtuYW1lX2RlcHRoXSwgbmFtZSwgbmFtZWxlbik7CgluYW1lX2RlcHRoKys7Cglpbm9kZSA9IGdldF9pbm9kZTIoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAoIWlub2RlKQoJCXJldHVybjsKCW5hbWVfZGVwdGgrKzsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJcHJpbnRmKCI6XG4iKTsKCQllbHNlCgkJCXByaW50ZigiXG4iKTsKCX0KCWNoZWNrX3pvbmVzMihpbm8pOwoJaWYgKGlub2RlICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCgkJcmVjdXJzaXZlX2NoZWNrMihpbm8pOwoJbmFtZV9kZXB0aC0tOwoJcmV0dXJuOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrKHVuc2lnbmVkIGludCBpbm8pCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZSArIGlubzsKCWlmICghU19JU0RJUihkaXItPmlfbW9kZSkpCgkJZGllKCJpbnRlcm5hbCBlcnJvciIpOwoJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlKGRpciwgb2Zmc2V0KTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZTIgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6IHNpemUgPCAzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGJhZF96b25lKGludCBpKQp7CgljaGFyIGJ1ZmZlclsxMDI0XTsKCglpZiAoQkxPQ0tfU0laRSAqIGkgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOwp9CgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICghaW5vZGVfaW5fdXNlKGkpICYmIElub2RlW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZVtpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIklub2RlICVkIG5vdCB1c2VkLCBtYXJrZWQgdXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlKGkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCB1c2VkLCBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGUgPSAlMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuIiwKCQkJCSAgIGksIElub2RlW2ldLmlfbW9kZSwgSW5vZGVbaV0uaV9ubGlua3MsIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoem9uZV9pbl91c2UoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQ6IG1hcmtlZCBpbiB1c2UsIG5vIGZpbGUgdXNlcyBpdC4iLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CgojaWZkZWYgQkJfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2tfY291bnRzMih2b2lkKQp7CglpbnQgaTsKCglmb3IgKGkgPSAxOyBpIDw9IElOT0RFUzsgaSsrKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkgJiYgSW5vZGUyW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZTJbaV0uaV9tb2RlID0gMDsKCQkJCWNoYW5nZWQgPSAxOwoJCQl9CgkJfQoJCWlmICghaW5vZGVfY291bnRbaV0pIHsKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJJbm9kZSAlZCBub3QgdXNlZCwgbWFya2VkIHVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkKCQkJCXVubWFya19pbm9kZShpKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgdXNlZCwgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJTZXQiLCAxKSkKCQkJCW1hcmtfaW5vZGUoaSk7CgkJfQoJCWlmIChJbm9kZTJbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCAobW9kZSA9ICUwN28pLCBpX25saW5rcz0lZCwgY291bnRlZD0lZC4iLAoJCQkJICAgaSwgSW5vZGUyW2ldLmlfbW9kZSwgSW5vZGUyW2ldLmlfbmxpbmtzLAoJCQkJICAgaW5vZGVfY291bnRbaV0pOwoJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoem9uZV9pbl91c2UoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQ6IG1hcmtlZCBpbiB1c2UsIG5vIGZpbGUgdXNlcyBpdC4iLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKewoJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CgltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKCWNoZWNrX3pvbmVzKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjayhST09UX0lOTyk7CgljaGVja19jb3VudHMoKTsKfQoKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrMih2b2lkKQp7CgltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKCW1lbXNldCh6b25lX2NvdW50LCAwLCBaT05FUyAqIHNpemVvZigqem9uZV9jb3VudCkpOwoJY2hlY2tfem9uZXMyKFJPT1RfSU5PKTsKCXJlY3Vyc2l2ZV9jaGVjazIoUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzMigpOwp9CiNlbmRpZgoKLyogV2VkIEZlYiAgOSAxNToxNzowNiBNU1QgMjAwMCAqLwovKiBkeW5hbWljYWxseSBhbGxvY2F0ZSBuYW1lX2xpc3QgKGluc3RlYWQgb2YgbWFraW5nIGl0IHN0YXRpYykgKi8Kc3RhdGljIHZvaWQgYWxsb2NfbmFtZV9saXN0KHZvaWQpCnsKCWludCBpOwoKCW5hbWVfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBNQVhfREVQVEgpOwoJZm9yIChpID0gMDsgaSA8IE1BWF9ERVBUSDsgaSsrKQoJCW5hbWVfbGlzdFtpXSA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIpICogQlVGU0laICsgMSk7Cn0KCiNpZmRlZiBCQl9GRUFUVVJFX0NMRUFOX1VQCi8qIGV4ZWN1dGUgdGhpcyBhdGV4aXQoKSB0byBkZWFsbG9jYXRlIG5hbWVfbGlzdFtdICovCi8qIHBpcHRpZ2dlciB3YXMgaGVyZSAqLwpzdGF0aWMgdm9pZCBmcmVlX25hbWVfbGlzdCh2b2lkKQp7CglpbnQgaTsKCglpZiAobmFtZV9saXN0KSB7IAoJCWZvciAoaSA9IDA7IGkgPCBNQVhfREVQVEg7IGkrKykgewoJCQlpZiAobmFtZV9saXN0W2ldKSB7CgkJCQlmcmVlKG5hbWVfbGlzdFtpXSk7CgkJCX0KCQl9CgkJZnJlZShuYW1lX2xpc3QpOwoJfQp9CiNlbmRpZgoKZXh0ZXJuIGludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglzdHJ1Y3QgdGVybWlvcyB0bXA7CglpbnQgY291bnQ7CglpbnQgcmV0Y29kZSA9IDA7CgoJYWxsb2NfbmFtZV9saXN0KCk7CiNpZmRlZiBCQl9GRUFUVVJFX0NMRUFOX1VQCgkvKiBEb24ndCBib3RoZXIgdG8gZnJlZSBtZW1vcnkuICBFeGl0IGRvZXMKCSAqIHRoYXQgYXV0b21hZ2ljYWxseSwgc28gd2UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgKi8KCWF0ZXhpdChmcmVlX25hbWVfbGlzdCk7CiNlbmRpZgoKCWlmIChJTk9ERV9TSVpFICogTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIGlub2RlIHNpemUiKTsKI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCglpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQoJCWRpZSgiYmFkIHYyIGlub2RlIHNpemUiKTsKI2VuZGlmCgl3aGlsZSAoYXJnYy0tID4gMSkgewoJCWFyZ3YrKzsKCQlpZiAoYXJndlswXVswXSAhPSAnLScpIHsKCQkJaWYgKGRldmljZV9uYW1lKQoJCQkJc2hvd191c2FnZSgpOwoJCQllbHNlCgkJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbMF07CgkJfSBlbHNlCgkJCXdoaWxlICgqKythcmd2WzBdKQoJCQkJc3dpdGNoIChhcmd2WzBdWzBdKSB7CgkJCQljYXNlICdsJzoKCQkJCQlsaXN0ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2EnOgoJCQkJCWF1dG9tYXRpYyA9IDE7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3InOgoJCQkJCWF1dG9tYXRpYyA9IDA7CgkJCQkJcmVwYWlyID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ3YnOgoJCQkJCXZlcmJvc2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncyc6CgkJCQkJc2hvdyA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdtJzoKCQkJCQl3YXJuX21vZGUgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnZic6CgkJCQkJZm9yY2UgPSAxOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlzaG93X3VzYWdlKCk7CgkJCQl9Cgl9CglpZiAoIWRldmljZV9uYW1lKQoJCXNob3dfdXNhZ2UoKTsKCWNoZWNrX21vdW50KCk7CQkJCS8qIHRyeWluZyB0byBjaGVjayBhIG1vdW50ZWQgZmlsZXN5c3RlbT8gKi8KCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCWlmICghaXNhdHR5KDApIHx8ICFpc2F0dHkoMSkpCgkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOwoJfQoJSU4gPSBvcGVuKGRldmljZV9uYW1lLCByZXBhaXIgPyBPX1JEV1IgOiBPX1JET05MWSk7CglpZiAoSU4gPCAwKXsKCQlmcHJpbnRmKHN0ZGVyciwidW5hYmxlIHRvIG9wZW4gZGV2aWNlICclcycuXG4iLGRldmljZV9uYW1lKTsKCQlsZWF2ZSg4KTsKCX0KCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyspCgkJc3luYygpOwoJcmVhZF9zdXBlcmJsb2NrKCk7CgoJLyoKCSAqIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgY2hlY2tpbmcuCgkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCgkgKiBmbGFncyBhbmQgd2hldGhlciBvciBub3QgdGhlIC1mIHN3aXRjaCB3YXMgc3BlY2lmaWVkIG9uIHRoZSAKCSAqIGNvbW1hbmQgbGluZS4KCSAqLwoJcHJpbnRmKCIlcywgJXNcbiIsIGFwcGxldF9uYW1lLCBwcm9ncmFtX3ZlcnNpb24pOwoJaWYgKCEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKSAmJgoJCShTdXBlci5zX3N0YXRlICYgTUlOSVhfVkFMSURfRlMpICYmICFmb3JjZSkgewoJCWlmIChyZXBhaXIpCgkJCXByaW50ZigiJXMgaXMgY2xlYW4sIG5vIGNoZWNrLlxuIiwgZGV2aWNlX25hbWUpOwoJCXJldHVybiByZXRjb2RlOwoJfSBlbHNlIGlmIChmb3JjZSkKCQlwcmludGYoIkZvcmNpbmcgZmlsZXN5c3RlbSBjaGVjayBvbiAlcy5cbiIsIGRldmljZV9uYW1lKTsKCWVsc2UgaWYgKHJlcGFpcikKCQlwcmludGYoIkZpbGVzeXN0ZW0gb24gJXMgaXMgZGlydHksIG5lZWRzIGNoZWNraW5nLlxuIiwKCQkJICAgZGV2aWNlX25hbWUpOwoKCXJlYWRfdGFibGVzKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJdGNnZXRhdHRyKDAsICZ0ZXJtaW9zKTsKCQl0bXAgPSB0ZXJtaW9zOwoJCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0bXApOwoJCXRlcm1pb3Nfc2V0ID0gMTsKCX0KI2lmZGVmIEJCX0ZFQVRVUkVfTUlOSVgyCglpZiAodmVyc2lvbjIpIHsKCQljaGVja19yb290MigpOwoJCWNoZWNrMigpOwoJfSBlbHNlCiNlbmRpZgoJewoJCWNoZWNrX3Jvb3QoKTsKCQljaGVjaygpOwoJfQoJaWYgKHZlcmJvc2UpIHsKCQlpbnQgaSwgZnJlZV9jbnQ7CgoJCWZvciAoaSA9IDEsIGZyZWVfY250ID0gMDsgaSA8PSBJTk9ERVM7IGkrKykKCQkJaWYgKCFpbm9kZV9pbl91c2UoaSkpCgkJCQlmcmVlX2NudCsrOwoJCXByaW50ZigiXG4lNmxkIGlub2RlcyB1c2VkICglbGQlJSlcbiIsIChJTk9ERVMgLSBmcmVlX2NudCksCgkJCSAgIDEwMCAqIChJTk9ERVMgLSBmcmVlX2NudCkgLyBJTk9ERVMpOwoJCWZvciAoaSA9IEZJUlNUWk9ORSwgZnJlZV9jbnQgPSAwOyBpIDwgWk9ORVM7IGkrKykKCQkJaWYgKCF6b25lX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCIlNmxkIHpvbmVzIHVzZWQgKCVsZCUlKVxuIiwgKFpPTkVTIC0gZnJlZV9jbnQpLAoJCQkgICAxMDAgKiAoWk9ORVMgLSBmcmVlX2NudCkgLyBaT05FUyk7CgkJcHJpbnRmKCJcbiU2ZCByZWd1bGFyIGZpbGVzXG4iCgkJCSAgICIlNmQgZGlyZWN0b3JpZXNcbiIKCQkJICAgIiU2ZCBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCgkJCSAgICIlNmQgbGlua3NcbiIKCQkJICAgIiU2ZCBzeW1ib2xpYyBsaW5rc1xuIgoJCQkgICAiLS0tLS0tXG4iCgkJCSAgICIlNmQgZmlsZXNcbiIsCgkJCSAgIHJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCgkJCSAgIGxpbmtzIC0gMiAqIGRpcmVjdG9yeSArIDEsIHN5bWxpbmtzLAoJCQkgICB0b3RhbCAtIDIgKiBkaXJlY3RvcnkgKyAxKTsKCX0KCWlmIChjaGFuZ2VkKSB7CgkJd3JpdGVfdGFibGVzKCk7CgkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCgkJCSAgICJGSUxFIFNZU1RFTSBIQVMgQkVFTiBDSEFOR0VEXG4iCgkJCSAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzOyBjb3VudCsrKQoJCQlzeW5jKCk7Cgl9IGVsc2UgaWYgKHJlcGFpcikKCQl3cml0ZV9zdXBlcl9ibG9jaygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykKCQl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRlcm1pb3MpOwoKCWlmIChjaGFuZ2VkKQoJCXJldGNvZGUgKz0gMzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJcmV0Y29kZSArPSA0OwoJcmV0dXJuIHJldGNvZGU7Cn0K