Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCiAqCiAqIChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQKICogYXMgcGVyIHRoZSBHTlUgY29weWxlZnQuCiAqLwoKLyoKICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucwogKgogKiAxMC4xMS45MSAgLSAgdXBkYXRlZCwgZG9lcyBjaGVja2luZywgbm8gcmVwYWlycyB5ZXQuCiAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgogKgogKiAxNC4xMS45MSAgLQlUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCiAqCQljb3JyZWN0aW9uLWNvZGUsIGFuZCBjaGFuZ2VkIHNvbWUgZnVuY3Rpb25zLgogKgogKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKICoJCWNhc2VzIG5vdywgYW5kIHRyaWVzIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGVtLgogKgogKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAogKgkJdGhpbmdzIHNlZW0gdG8gd29yayBub3cuIFllYWgsIHN1cmUuCiAqCiAqCiAqIDE5LjA0LjkyICAtCUhhZCB0byBzdGFydCBvdmVyIGFnYWluIGZyb20gdGhpcyBvbGQgdmVyc2lvbiwgYXMgYQogKgkJa2VybmVsIGJ1ZyBhdGUgbXkgZW5oYW5jZWQgZnNjayBpbiBmZWJydWFyeS4KICoKICogMjguMDIuOTMgIC0JYWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IGRpcmVjdG9yeSBlbnRyeSBzaXplcy4uCiAqCiAqIFNhdCBNYXIgIDYgMTg6NTk6NDIgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogT3V0cHV0IG5hbWVsZW4gd2l0aAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLWJsb2NrIGluZm9ybWF0aW9uCiAqCiAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKICoKICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKICoJCQkgICAgICBBZGRlZCBzdXBwb3J0IGZvciBmaWxlIHN5c3RlbSB2YWxpZCBmbGFnLiAgQWxzbwogKgkJCSAgICAgIGFkZGVkIHByb2dyYW1fdmVyc2lvbiB2YXJpYWJsZSBhbmQgb3V0cHV0IG9mCiAqCQkJICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KICoJCQkgICAgICBpcyBleGVjdXRlZC4KICoKICogMzAuMTAuOTQgLSBhZGRlZCBzdXBwb3J0IGZvciB2MiBmaWxlc3lzdGVtCiAqICAgICAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCiAqCiAqIDEwLjEyLjk0ICAtICBhZGRlZCB0ZXN0IHRvIHByZXZlbnQgY2hlY2tpbmcgb2YgbW91bnRlZCBmcyBhZGFwdGVkCiAqICAgICAgICAgICAgICBmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIGUyZnNjawogKiAgICAgICAgICAgICAgcHJvZ3JhbS4gIChEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQogKgogKiAwMS4wNy45NiAgLSBGaXhlZCB0aGUgdjIgZnMgc3R1ZmYgdG8gdXNlIHRoZSByaWdodCAjZGVmaW5lcyBhbmQgc3VjaAogKgkgICAgICAgZm9yIG1vZGVybiBsaWJjcyAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51awogKiAgICAgICAgICAgICAoUnVzc2VsbCBLaW5nKS4gIEhlIG1hZGUgdGhlbSBmb3IgQVJNLiAgSXQgd291bGQgc2VlbQogKgkgICAgICAgdGhhdCB0aGUgQVJNIGlzIHBvd2VyZnVsIGVub3VnaCB0byBkbyB0aGlzIGluIEMgd2hlcmVhcwogKiAgICAgICAgICAgICBpMzg2IGFuZCBtNjRrIG11c3QgdXNlIGFzc2VtYmx5IHRvIGdldCBpdCBmYXN0ID46LSkKICoJICAgICAgIFRoaXMgc2hvdWxkIG1ha2UgbWluaXggZnNjayBzeXN0ZW0taW5kZXBlbmRlbnQuCiAqCSAgICAgICAoamFubEBtYXRoLnVpby5ubywgTmljb2xhaSBMYW5nZmVsZHQpCiAqCiAqIDA0LjExLjk2ICAtIEFkZGVkIG1pbm9yIGZpeGVzIGZyb20gQW5kcmVhcyBTY2h3YWIgdG8gYXZvaWQgY29tcGlsZXIKICogICAgICAgICAgICAgd2FybmluZ3MuICBBZGRlZCBtYzY4ayBiaXRvcHMgZnJvbQogKgkgICAgICAgSm9lcmcgRG9yY2hhaW4gPGRvcmNoYWluQG1waS1zYi5tcGcuZGU+LgogKgogKiAwNi4xMS45NiAgLSBBZGRlZCB2MiBjb2RlIHN1Ym1pdHRlZCBieSBKb2VyZyBEb3JjaGFpbiwgYnV0IHdyaXR0ZW4gYnkKICogICAgICAgICAgICAgQW5kcmVhcyBTY2h3YWIuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqCiAqIEkndmUgaGFkIG5vIHRpbWUgdG8gYWRkIGNvbW1lbnRzIC0gaG9wZWZ1bGx5IHRoZSBmdW5jdGlvbiBuYW1lcwogKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCiAqIHRoZSBmaWxlIHN5c3RlbSBpcyBxdWllc2NlbnQgLSBkb24ndCB1c2UgaXQgb24gYSBtb3VudGVkIGRldmljZQogKiB1bmxlc3MgeW91IGNhbiBiZSBzdXJlIG5vYm9keSBpcyB3cml0aW5nIHRvIGl0IChhbmQgcmVtZW1iZXIgdGhhdCB0aGUKICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCiAqCiAqIFVzYWdlOiBmc2NrIFstbGFydnNtXSBkZXZpY2UKICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcwogKgktYSBmb3IgYXV0b21hdGljIHJlcGFpcnMgKG5vdCBpbXBsZW1lbnRlZCkKICoJLXIgZm9yIHJlcGFpcnMgKGludGVyYWN0aXZlKSAobm90IGltcGxlbWVudGVkKQogKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCiAqCS1zIGZvciBzdXBlci1ibG9jayBpbmZvCiAqCS1tIGZvciBtaW5peC1saWtlICJtb2RlIG5vdCBjbGVhcmVkIiB3YXJuaW5ncwogKgktZiBmb3JjZSBmaWxlc3lzdGVtIGNoZWNrIGV2ZW4gaWYgZmlsZXN5c3RlbSBtYXJrZWQgYXMgdmFsaWQKICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYSBpbWFnZSBvZiBvbmUsIGJ1dCB0aGlzIGlzbid0CiAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPG1udGVudC5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlICJidXN5Ym94LmgiCgpzdGF0aWMgY29uc3QgaW50IE1JTklYX1JPT1RfSU5PID0gMTsKc3RhdGljIGNvbnN0IGludCBNSU5JWF9MSU5LX01BWCA9IDI1MDsKc3RhdGljIGNvbnN0IGludCBNSU5JWDJfTElOS19NQVggPSA2NTUzMDsKCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfSV9NQVBfU0xPVFMgPSA4OwpzdGF0aWMgY29uc3QgaW50IE1JTklYX1pfTUFQX1NMT1RTID0gNjQ7CnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfU1VQRVJfTUFHSUMgPSAweDEzN0Y7CQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwpzdGF0aWMgY29uc3QgaW50IE1JTklYX1NVUEVSX01BR0lDMiA9IDB4MTM4RjsJCS8qIG1pbml4IGZzLCAzMCBjaGFyIG5hbWVzICovCnN0YXRpYyBjb25zdCBpbnQgTUlOSVgyX1NVUEVSX01BR0lDID0gMHgyNDY4OwkJLyogbWluaXggVjIgZnMgKi8Kc3RhdGljIGNvbnN0IGludCBNSU5JWDJfU1VQRVJfTUFHSUMyID0gMHgyNDc4OwkJLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8Kc3RhdGljIGNvbnN0IGludCBNSU5JWF9WQUxJRF9GUyA9IDB4MDAwMTsJCS8qIENsZWFuIGZzLiAqLwpzdGF0aWMgY29uc3QgaW50IE1JTklYX0VSUk9SX0ZTID0gMHgwMDAyOwkJLyogZnMgaGFzIGVycm9ycy4gKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQojZGVmaW5lIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICgoQkxPQ0tfU0laRSkvKHNpemVvZiAoc3RydWN0IG1pbml4Ml9pbm9kZSkpKQoKc3RhdGljIGNvbnN0IGludCBNSU5JWF9WMSA9IDB4MDAwMTsJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCnN0YXRpYyBjb25zdCBpbnQgTUlOSVhfVjIgPSAweDAwMDI7CQkvKiBtaW5peCBWMiBmcyAqLwoKI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQlpbm9kZS0+aV9zYi0+dS5taW5peF9zYi5zX3ZlcnNpb24KCi8qCiAqIFRoaXMgaXMgdGhlIG9yaWdpbmFsIG1pbml4IGlub2RlIGxheW91dCBvbiBkaXNrLgogKiBOb3RlIHRoZSA4LWJpdCBnaWQgYW5kIGF0aW1lIGFuZCBjdGltZS4KICovCnN0cnVjdCBtaW5peF9pbm9kZSB7Cgl1aW50MTZfdCBpX21vZGU7Cgl1aW50MTZfdCBpX3VpZDsKCXVpbnQzMl90IGlfc2l6ZTsKCXVpbnQzMl90IGlfdGltZTsKCXVpbnQ4X3QgIGlfZ2lkOwoJdWludDhfdCAgaV9ubGlua3M7Cgl1aW50MTZfdCBpX3pvbmVbOV07Cn07CgovKgogKiBUaGUgbmV3IG1pbml4IGlub2RlIGhhcyBhbGwgdGhlIHRpbWUgZW50cmllcywgYXMgd2VsbCBhcwogKiBsb25nIGJsb2NrIG51bWJlcnMgYW5kIGEgdGhpcmQgaW5kaXJlY3QgYmxvY2sgKDcrMSsxKzEKICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCiAqIG5vdyAxNi1iaXQuIFRoZSBpbm9kZSBpcyBub3cgNjQgYnl0ZXMgaW5zdGVhZCBvZiAzMi4KICovCnN0cnVjdCBtaW5peDJfaW5vZGUgewoJdWludDE2X3QgaV9tb2RlOwoJdWludDE2X3QgaV9ubGlua3M7Cgl1aW50MTZfdCBpX3VpZDsKCXVpbnQxNl90IGlfZ2lkOwoJdWludDMyX3QgaV9zaXplOwoJdWludDMyX3QgaV9hdGltZTsKCXVpbnQzMl90IGlfbXRpbWU7Cgl1aW50MzJfdCBpX2N0aW1lOwoJdWludDMyX3QgaV96b25lWzEwXTsKfTsKCi8qCiAqIG1pbml4IHN1cGVyLWJsb2NrIGRhdGEgb24gZGlzawogKi8Kc3RydWN0IG1pbml4X3N1cGVyX2Jsb2NrIHsKCXVpbnQxNl90IHNfbmlub2RlczsKCXVpbnQxNl90IHNfbnpvbmVzOwoJdWludDE2X3Qgc19pbWFwX2Jsb2NrczsKCXVpbnQxNl90IHNfem1hcF9ibG9ja3M7Cgl1aW50MTZfdCBzX2ZpcnN0ZGF0YXpvbmU7Cgl1aW50MTZfdCBzX2xvZ196b25lX3NpemU7Cgl1aW50MzJfdCBzX21heF9zaXplOwoJdWludDE2X3Qgc19tYWdpYzsKCXVpbnQxNl90IHNfc3RhdGU7Cgl1aW50MzJfdCBzX3pvbmVzOwp9OwoKc3RydWN0IG1pbml4X2Rpcl9lbnRyeSB7Cgl1aW50MTZfdCBpbm9kZTsKCWNoYXIgbmFtZVswXTsKfTsKCiNkZWZpbmUgQkxPQ0tfU0laRV9CSVRTIDEwCiNkZWZpbmUgQkxPQ0tfU0laRSAoMTw8QkxPQ0tfU0laRV9CSVRTKQoKI2RlZmluZSBOQU1FX01BWCAgICAgICAgIDI1NSAgIC8qICMgY2hhcnMgaW4gYSBmaWxlIG5hbWUgKi8KCiNkZWZpbmUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSyAoKEJMT0NLX1NJWkUpLyhzaXplb2YgKHN0cnVjdCBtaW5peF9pbm9kZSkpKQoKI2lmbmRlZiBCTEtHRVRTSVpFCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikgICAgLyogcmV0dXJuIGRldmljZSBzaXplICovCiNlbmRpZgoKI2lmbmRlZiBfX2xpbnV4X18KI2RlZmluZSB2b2xhdGlsZQojZW5kaWYKCnN0YXRpYyBjb25zdCBpbnQgUk9PVF9JTk8gPSAxOwoKI2RlZmluZSBVUFBFUihzaXplLG4pICgoc2l6ZSsoKG4pLTEpKS8obikpCiNkZWZpbmUgSU5PREVfU0laRSAoc2l6ZW9mKHN0cnVjdCBtaW5peF9pbm9kZSkpCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKI2RlZmluZSBJTk9ERV9TSVpFMiAoc2l6ZW9mKHN0cnVjdCBtaW5peDJfaW5vZGUpKQojZGVmaW5lIElOT0RFX0JMT0NLUyBVUFBFUihJTk9ERVMsICh2ZXJzaW9uMiA/IE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIFwKCQkJCSAgICA6IE1JTklYX0lOT0RFU19QRVJfQkxPQ0spKQojZWxzZQojZGVmaW5lIElOT0RFX0JMT0NLUyBVUFBFUihJTk9ERVMsIChNSU5JWF9JTk9ERVNfUEVSX0JMT0NLKSkKI2VuZGlmCiNkZWZpbmUgSU5PREVfQlVGRkVSX1NJWkUgKElOT0RFX0JMT0NLUyAqIEJMT0NLX1NJWkUpCgojZGVmaW5lIEJJVFNfUEVSX0JMT0NLIChCTE9DS19TSVpFPDwzKQoKc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIxLjIgLSAxMS8xMS85NiI7CnN0YXRpYyBjaGFyICpkZXZpY2VfbmFtZSA9IE5VTEw7CnN0YXRpYyBpbnQgSU47CnN0YXRpYyBpbnQgcmVwYWlyID0gMCwgYXV0b21hdGljID0gMCwgdmVyYm9zZSA9IDAsIGxpc3QgPSAwLCBzaG93ID0KCTAsIHdhcm5fbW9kZSA9IDAsIGZvcmNlID0gMDsKc3RhdGljIGludCBkaXJlY3RvcnkgPSAwLCByZWd1bGFyID0gMCwgYmxvY2tkZXYgPSAwLCBjaGFyZGV2ID0gMCwgbGlua3MgPQoJMCwgc3ltbGlua3MgPSAwLCB0b3RhbCA9IDA7CgpzdGF0aWMgaW50IGNoYW5nZWQgPSAwOwkJCS8qIGZsYWdzIGlmIHRoZSBmaWxlc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgKi8Kc3RhdGljIGludCBlcnJvcnNfdW5jb3JyZWN0ZWQgPSAwOwkvKiBmbGFnIGlmIHNvbWUgZXJyb3Igd2FzIG5vdCBjb3JyZWN0ZWQgKi8Kc3RhdGljIGludCBkaXJzaXplID0gMTY7CnN0YXRpYyBpbnQgbmFtZWxlbiA9IDE0OwpzdGF0aWMgaW50IHZlcnNpb24yID0gMDsKc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRlcm1pb3M7CnN0YXRpYyBpbnQgdGVybWlvc19zZXQgPSAwOwoKLyogRmlsZS1uYW1lIGRhdGEgKi8Kc3RhdGljIGNvbnN0IGludCBNQVhfREVQVEggPSAzMjsKc3RhdGljIGludCBuYW1lX2RlcHRoID0gMDsKLy8gc3RhdGljIGNoYXIgbmFtZV9saXN0W01BWF9ERVBUSF1bQlVGU0laICsgMV07CnN0YXRpYyBjaGFyICoqbmFtZV9saXN0ID0gTlVMTDsKCnN0YXRpYyBjaGFyICppbm9kZV9idWZmZXIgPSBOVUxMOwoKI2RlZmluZSBJbm9kZSAoKChzdHJ1Y3QgbWluaXhfaW5vZGUgKikgaW5vZGVfYnVmZmVyKS0xKQojZGVmaW5lIElub2RlMiAoKChzdHJ1Y3QgbWluaXgyX2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKc3RhdGljIGNoYXIgc3VwZXJfYmxvY2tfYnVmZmVyW0JMT0NLX1NJWkVdOwoKI2RlZmluZSBTdXBlciAoKihzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKilzdXBlcl9ibG9ja19idWZmZXIpCiNkZWZpbmUgSU5PREVTICgodW5zaWduZWQgbG9uZylTdXBlci5zX25pbm9kZXMpCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKI2Vsc2UKI2RlZmluZSBaT05FUyAoKHVuc2lnbmVkIGxvbmcpKFN1cGVyLnNfbnpvbmVzKSkKI2VuZGlmCiNkZWZpbmUgSU1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfaW1hcF9ibG9ja3MpCiNkZWZpbmUgWk1BUFMgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfem1hcF9ibG9ja3MpCiNkZWZpbmUgRklSU1RaT05FICgodW5zaWduZWQgbG9uZylTdXBlci5zX2ZpcnN0ZGF0YXpvbmUpCiNkZWZpbmUgWk9ORVNJWkUgKCh1bnNpZ25lZCBsb25nKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKI2RlZmluZSBNQVhTSVpFICgodW5zaWduZWQgbG9uZylTdXBlci5zX21heF9zaXplKQojZGVmaW5lIE1BR0lDIChTdXBlci5zX21hZ2ljKQojZGVmaW5lIE5PUk1fRklSU1RaT05FICgyK0lNQVBTK1pNQVBTK0lOT0RFX0JMT0NLUykKCnN0YXRpYyBjaGFyICppbm9kZV9tYXA7CnN0YXRpYyBjaGFyICp6b25lX21hcDsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudCA9IE5VTEw7CnN0YXRpYyB1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50ID0gTlVMTDsKCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbnQgaW5vKTsKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2syKHVuc2lnbmVkIGludCBpbm8pOwojZW5kaWYKCnN0YXRpYyBpbmxpbmUgaW50IGJpdChjaGFyICogYSx1bnNpZ25lZCBpbnQgaSkKewoJICByZXR1cm4gKGFbaSA+PiAzXSAmICgxPDwoaSAmIDcpKSkgIT0gMDsKfQojZGVmaW5lIGlub2RlX2luX3VzZSh4KSAoYml0KGlub2RlX21hcCwoeCkpKQojZGVmaW5lIHpvbmVfaW5fdXNlKHgpIChiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKCiNkZWZpbmUgbWFya19pbm9kZSh4KSAoc2V0Yml0KGlub2RlX21hcCwoeCkpLGNoYW5nZWQ9MSkKI2RlZmluZSB1bm1hcmtfaW5vZGUoeCkgKGNscmJpdChpbm9kZV9tYXAsKHgpKSxjaGFuZ2VkPTEpCgojZGVmaW5lIG1hcmtfem9uZSh4KSAoc2V0Yml0KHpvbmVfbWFwLCh4KS1GSVJTVFpPTkUrMSksY2hhbmdlZD0xKQojZGVmaW5lIHVubWFya196b25lKHgpIChjbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSxjaGFuZ2VkPTEpCgpzdGF0aWMgdm9pZCBsZWF2ZShpbnQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwpzdGF0aWMgdm9pZCBsZWF2ZShpbnQgc3RhdHVzKQp7CglpZiAodGVybWlvc19zZXQpCgkJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0ZXJtaW9zKTsKCWV4aXQoc3RhdHVzKTsKfQoKc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJYmJfZXJyb3JfbXNnKCIlcyIsIHN0cik7CglsZWF2ZSg4KTsKfQoKLyoKICogVGhpcyBzaW1wbHkgZ29lcyB0aHJvdWdoIHRoZSBmaWxlLW5hbWUgZGF0YSBhbmQgcHJpbnRzIG91dCB0aGUKICogY3VycmVudCBmaWxlLgogKi8Kc3RhdGljIHZvaWQgcHJpbnRfY3VycmVudF9uYW1lKHZvaWQpCnsKCWludCBpID0gMDsKCgl3aGlsZSAoaSA8IG5hbWVfZGVwdGgpCgkJcHJpbnRmKCIvJS4qcyIsIG5hbWVsZW4sIG5hbWVfbGlzdFtpKytdKTsKCWlmIChpID09IDApCgkJcHJpbnRmKCIvIik7Cn0KCnN0YXRpYyBpbnQgYXNrKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGRlZikKewoJaW50IGM7CgoJaWYgKCFyZXBhaXIpIHsKCQlwcmludGYoIlxuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQlyZXR1cm4gMDsKCX0KCWlmIChhdXRvbWF0aWMpIHsKCQlwcmludGYoIlxuIik7CgkJaWYgKCFkZWYpCgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuIGRlZjsKCX0KCXByaW50ZihkZWYgPyAiJXMgKHkvbik/ICIgOiAiJXMgKG4veSk/ICIsIHN0cmluZyk7Cglmb3IgKDs7KSB7CgkJZmZsdXNoKHN0ZG91dCk7CgkJaWYgKChjID0gZ2V0Y2hhcigpKSA9PSBFT0YpIHsKCQkJaWYgKCFkZWYpCgkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQlyZXR1cm4gZGVmOwoJCX0KCQljID0gdG91cHBlcihjKTsKCQlpZiAoYyA9PSAnWScpIHsKCQkJZGVmID0gMTsKCQkJYnJlYWs7CgkJfSBlbHNlIGlmIChjID09ICdOJykgewoJCQlkZWYgPSAwOwoJCQlicmVhazsKCQl9IGVsc2UgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1xuJykKCQkJYnJlYWs7Cgl9CglpZiAoZGVmKQoJCXByaW50ZigieVxuIik7CgllbHNlIHsKCQlwcmludGYoIm5cbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglyZXR1cm4gZGVmOwp9CgovKgogKiBNYWtlIGNlcnRhaW4gdGhhdCB3ZSBhcmVuJ3QgY2hlY2tpbmcgYSBmaWxlc3lzdGVtIHRoYXQgaXMgb24gYQogKiBtb3VudGVkIHBhcnRpdGlvbi4gIENvZGUgYWRhcHRlZCBmcm9tIGUyZnNjaywgQ29weXJpZ2h0IChDKSAxOTkzLAogKiAxOTk0IFRoZW9kb3JlIFRzJ28uICBBbHNvIGxpY2Vuc2VkIHVuZGVyIEdQTC4KICovCnN0YXRpYyB2b2lkIGNoZWNrX21vdW50KHZvaWQpCnsKCUZJTEUgKmY7CglzdHJ1Y3QgbW50ZW50ICptbnQ7CglpbnQgY29udDsKCWludCBmZDsKCglpZiAoKGYgPSBzZXRtbnRlbnQoTU9VTlRFRCwgInIiKSkgPT0gTlVMTCkKCQlyZXR1cm47Cgl3aGlsZSAoKG1udCA9IGdldG1udGVudChmKSkgIT0gTlVMTCkKCQlpZiAoc3RyY21wKGRldmljZV9uYW1lLCBtbnQtPm1udF9mc25hbWUpID09IDApCgkJCWJyZWFrOwoJZW5kbW50ZW50KGYpOwoJaWYgKCFtbnQpCgkJcmV0dXJuOwoKCS8qCgkgKiBJZiB0aGUgcm9vdCBpcyBtb3VudGVkIHJlYWQtb25seSwgdGhlbiAvZXRjL210YWIgaXMKCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KCSAqIGl0LgoJICovCglmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSKTsKCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCgkJcmV0dXJuOwoJZWxzZQoJCWNsb3NlKGZkKTsKCglwcmludGYoIiVzIGlzIG1vdW50ZWQuCSAiLCBkZXZpY2VfbmFtZSk7CglpZiAoaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKCQljb250ID0gYXNrKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWUiLCAwKTsKCWVsc2UKCQljb250ID0gMDsKCWlmICghY29udCkgewoJCXByaW50ZigiY2hlY2sgYWJvcnRlZC5cbiIpOwoJCWV4aXQoMCk7Cgl9CglyZXR1cm47Cn0KCi8qCiAqIGNoZWNrX3pvbmVfbnIgY2hlY2tzIHRvIHNlZSB0aGF0ICpuciBpcyBhIHZhbGlkIHpvbmUgbnIuIElmIGl0CiAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAogKiBpZiBhbiBlcnJvciB3YXMgY29ycmVjdGVkLCBhbmQgcmV0dXJucyB0aGUgem9uZSAoMCBmb3Igbm8gem9uZQogKiBvciBhIGJhZCB6b25lLW51bWJlcikuCiAqLwpzdGF0aWMgaW50IGNoZWNrX3pvbmVfbnIodW5zaWduZWQgc2hvcnQgKm5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCXByaW50ZigiWm9uZSBuciA8IEZJUlNUWk9ORSBpbiBmaWxlIGAiKTsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQlwcmludGYoIlpvbmUgbnIgPj0gWk9ORVMgaW4gZmlsZSBgIik7CgllbHNlCgkJcmV0dXJuICpucjsKCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJcHJpbnRmKCInLiIpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIGludCBjaGVja196b25lX25yMih1bnNpZ25lZCBpbnQgKm5yLCBpbnQgKmNvcnJlY3RlZCkKewoJaWYgKCEqbnIpCgkJcmV0dXJuIDA7CglpZiAoKm5yIDwgRklSU1RaT05FKQoJCXByaW50ZigiWm9uZSBuciA8IEZJUlNUWk9ORSBpbiBmaWxlIGAiKTsKCWVsc2UgaWYgKCpuciA+PSBaT05FUykKCQlwcmludGYoIlpvbmUgbnIgPj0gWk9ORVMgaW4gZmlsZSBgIik7CgllbHNlCgkJcmV0dXJuICpucjsKCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJcHJpbnRmKCInLiIpOwoJaWYgKGFzaygiUmVtb3ZlIGJsb2NrIiwgMSkpIHsKCQkqbnIgPSAwOwoJCSpjb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgogKi8Kc3RhdGljIHZvaWQgcmVhZF9ibG9jayh1bnNpZ25lZCBpbnQgbnIsIGNoYXIgKmFkZHIpCnsKCWlmICghbnIpIHsKCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpIHsKCQlwcmludGYoIlJlYWQgZXJyb3I6IHVuYWJsZSB0byBzZWVrIHRvIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9IGVsc2UgaWYgKEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgYWRkciwgQkxPQ0tfU0laRSkpIHsKCQlwcmludGYoIlJlYWQgZXJyb3I6IGJhZCBibG9jayBpbiBmaWxlICciKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIidcbiIpOwoJCW1lbXNldChhZGRyLCAwLCBCTE9DS19TSVpFKTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQp9CgovKgogKiB3cml0ZV9ibG9jayB3cml0ZXMgYmxvY2sgbnIgdG8gZGlzay4KICovCnN0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIGludCBuciwgY2hhciAqYWRkcikKewoJaWYgKCFucikKCQlyZXR1cm47CglpZiAobnIgPCBGSVJTVFpPTkUgfHwgbnIgPj0gWk9ORVMpIHsKCQlwcmludGYoIkludGVybmFsIGVycm9yOiB0cnlpbmcgdG8gd3JpdGUgYmFkIGJsb2NrXG4iCgkJCSAgICJXcml0ZSByZXF1ZXN0IGlnbm9yZWRcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJcmV0dXJuOwoJfQoJaWYgKEJMT0NLX1NJWkUgKiBuciAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSAqIG5yLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiB3cml0ZV9ibG9jayIpOwoJaWYgKEJMT0NLX1NJWkUgIT0gd3JpdGUoSU4sIGFkZHIsIEJMT0NLX1NJWkUpKSB7CgkJcHJpbnRmKCJXcml0ZSBlcnJvcjogYmFkIGJsb2NrIGluIGZpbGUgJyIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJ1xuIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KfQoKLyoKICogbWFwLWJsb2NrIGNhbGN1bGF0ZXMgdGhlIGFic29sdXRlIGJsb2NrIG5yIG9mIGEgYmxvY2sgaW4gYSBmaWxlLgogKiBJdCBzZXRzICdjaGFuZ2VkJyBpZiB0aGUgaW5vZGUgaGFzIG5lZWRlZCBjaGFuZ2luZywgYW5kIHJlLXdyaXRlcwogKiBhbnkgaW5kaXJlY3QgYmxvY2tzIHdpdGggZXJyb3JzLgogKi8Kc3RhdGljIGludCBtYXBfYmxvY2soc3RydWN0IG1pbml4X2lub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7Cgl1bnNpZ25lZCBzaG9ydCBpbmRbQkxPQ0tfU0laRSA+PiAxXTsKCXVuc2lnbmVkIHNob3J0IGRpbmRbQkxPQ0tfU0laRSA+PiAxXTsKCWludCBibGtfY2hnLCBibG9jaywgcmVzdWx0OwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CglibGtuciAtPSA3OwoJaWYgKGJsa25yIDwgNTEyKSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyA3LCAmY2hhbmdlZCk7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSA1MTI7CglibG9jayA9IGNoZWNrX3pvbmVfbnIoaW5vZGUtPmlfem9uZSArIDgsICZjaGFuZ2VkKTsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yKGRpbmQgKyAoYmxrbnIgLyA1MTIpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoaW5kICsgKGJsa25yICUgNTEyKSwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyBpbnQgbWFwX2Jsb2NrMihzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGJsa25yKQp7Cgl1bnNpZ25lZCBpbnQgaW5kW0JMT0NLX1NJWkUgPj4gMl07Cgl1bnNpZ25lZCBpbnQgZGluZFtCTE9DS19TSVpFID4+IDJdOwoJdW5zaWduZWQgaW50IHRpbmRbQkxPQ0tfU0laRSA+PiAyXTsKCWludCBibGtfY2hnLCBibG9jaywgcmVzdWx0OwoKCWlmIChibGtuciA8IDcpCgkJcmV0dXJuIGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOwoJYmxrbnIgLT0gNzsKCWlmIChibGtuciA8IDI1NikgewoJCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIDcsICZjaGFuZ2VkKTsKCQlyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGJsa25yICsgaW5kLCAmYmxrX2NoZyk7CgkJaWYgKGJsa19jaGcpCgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJCXJldHVybiByZXN1bHQ7Cgl9CglibGtuciAtPSAyNTY7CglpZiAoYmxrbnIgPj0gMjU2ICogMjU2KSB7CgkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOwoJCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJCWJsa19jaGcgPSAwOwoJCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKGRpbmQgKyBibGtuciAvIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgZGluZCk7CgkJYmxvY2sgPSByZXN1bHQ7CgkJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlibGtfY2hnID0gMDsKCQlyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJCWlmIChibGtfY2hnKQoJCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgaW5kKTsKCQlyZXR1cm4gcmVzdWx0OwoJfQoJYmxrbnIgLT0gMjU2ICogMjU2OwoJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOSwgJmNoYW5nZWQpOwoJcmVhZF9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibGtfY2hnID0gMDsKCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKHRpbmQgKyBibGtuciAvICgyNTYgKiAyNTYpLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgKGNoYXIgKikgdGluZCk7CglibG9jayA9IHJlc3VsdDsKCXJlYWRfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihkaW5kICsgKGJsa25yIC8gMjU2KSAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGRpbmQpOwoJYmxvY2sgPSByZXN1bHQ7CglyZWFkX2Jsb2NrKGJsb2NrLCAoY2hhciAqKSBpbmQpOwoJYmxrX2NoZyA9IDA7CglyZXN1bHQgPSBjaGVja196b25lX25yMihpbmQgKyBibGtuciAlIDI1NiwgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIChjaGFyICopIGluZCk7CglyZXR1cm4gcmVzdWx0Owp9CiNlbmRpZgoKc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJfYmxvY2sodm9pZCkKewoJLyoKCSAqIFNldCB0aGUgc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlcmUKCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCgkgKiB1bmNvbmRpdGlvbmFsbHkgc2V0IGlmIHdlIGdldCB0aGlzIGZhci4KCSAqLwoJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUzsKCWlmIChlcnJvcnNfdW5jb3JyZWN0ZWQpCgkJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9FUlJPUl9GUzsKCWVsc2UKCQlTdXBlci5zX3N0YXRlICY9IH5NSU5JWF9FUlJPUl9GUzsKCglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQgaW4gd3JpdGVfc3VwZXJfYmxvY2siKTsKCWlmIChCTE9DS19TSVpFICE9IHdyaXRlKElOLCBzdXBlcl9ibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQoJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHN1cGVyLWJsb2NrIik7CgoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZCB3cml0ZV90YWJsZXModm9pZCkKewoJd3JpdGVfc3VwZXJfYmxvY2soKTsKCglpZiAoSU1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gd3JpdGUgaW5vZGUgbWFwIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKElOLCB6b25lX21hcCwgWk1BUFMgKiBCTE9DS19TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHdyaXRlKElOLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBpbm9kZXMiKTsKfQoKc3RhdGljIHZvaWQgZ2V0X2RpcnNpemUodm9pZCkKewoJaW50IGJsb2NrOwoJY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgc2l6ZTsKCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKCWlmICh2ZXJzaW9uMikKCQlibG9jayA9IElub2RlMltST09UX0lOT10uaV96b25lWzBdOwoJZWxzZQojZW5kaWYKCQlibG9jayA9IElub2RlW1JPT1RfSU5PXS5pX3pvbmVbMF07CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChzaXplID0gMTY7IHNpemUgPCBCTE9DS19TSVpFOyBzaXplIDw8PSAxKSB7CgkJaWYgKHN0cmNtcChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgewoJCQlkaXJzaXplID0gc2l6ZTsKCQkJbmFtZWxlbiA9IHNpemUgLSAyOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogdXNlIGRlZmF1bHRzICovCn0KCnN0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQp7CglpZiAoQkxPQ0tfU0laRSAhPSBsc2VlayhJTiwgQkxPQ0tfU0laRSwgU0VFS19TRVQpKQoJCWRpZSgic2VlayBmYWlsZWQiKTsKCWlmIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIHN1cGVyX2Jsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCgkJZGllKCJ1bmFibGUgdG8gcmVhZCBzdXBlciBibG9jayIpOwoJaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDKSB7CgkJbmFtZWxlbiA9IDE0OwoJCWRpcnNpemUgPSAxNjsKCQl2ZXJzaW9uMiA9IDA7Cgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYX1NVUEVSX01BR0lDMikgewoJCW5hbWVsZW4gPSAzMDsKCQlkaXJzaXplID0gMzI7CgkJdmVyc2lvbjIgPSAwOwojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCgl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMl9TVVBFUl9NQUdJQykgewoJCW5hbWVsZW4gPSAxNDsKCQlkaXJzaXplID0gMTY7CgkJdmVyc2lvbjIgPSAxOwoJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMyKSB7CgkJbmFtZWxlbiA9IDMwOwoJCWRpcnNpemUgPSAzMjsKCQl2ZXJzaW9uMiA9IDE7CiNlbmRpZgoJfSBlbHNlCgkJZGllKCJiYWQgbWFnaWMgbnVtYmVyIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk9ORVNJWkUgIT0gMCB8fCBCTE9DS19TSVpFICE9IDEwMjQpCgkJZGllKCJPbmx5IDFrIGJsb2Nrcy96b25lcyBzdXBwb3J0ZWQiKTsKCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgSU5PREVTICsgMSkKCQlkaWUoImJhZCBzX2ltYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7CglpZiAoWk1BUFMgKiBCTE9DS19TSVpFICogOCA8IFpPTkVTIC0gRklSU1RaT05FICsgMSkKCQlkaWUoImJhZCBzX3ptYXBfYmxvY2tzIGZpZWxkIGluIHN1cGVyLWJsb2NrIik7Cn0KCnN0YXRpYyB2b2lkIHJlYWRfdGFibGVzKHZvaWQpCnsKCWlub2RlX21hcCA9IHhtYWxsb2MoSU1BUFMgKiBCTE9DS19TSVpFKTsKCXpvbmVfbWFwID0geG1hbGxvYyhaTUFQUyAqIEJMT0NLX1NJWkUpOwoJbWVtc2V0KGlub2RlX21hcCwgMCwgc2l6ZW9mKGlub2RlX21hcCkpOwoJbWVtc2V0KHpvbmVfbWFwLCAwLCBzaXplb2Yoem9uZV9tYXApKTsKCWlub2RlX2J1ZmZlciA9IHhtYWxsb2MoSU5PREVfQlVGRkVSX1NJWkUpOwoJaW5vZGVfY291bnQgPSB4bWFsbG9jKElOT0RFUyArIDEpOwoJem9uZV9jb3VudCA9IHhtYWxsb2MoWk9ORVMpOwoJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSByZWFkKElOLCBpbm9kZV9tYXAsIElNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCBpbm9kZSBtYXAiKTsKCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChJTiwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCgkJZGllKCJVbmFibGUgdG8gcmVhZCB6b25lIG1hcCIpOwoJaWYgKElOT0RFX0JVRkZFUl9TSVpFICE9IHJlYWQoSU4sIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQoJCWRpZSgiVW5hYmxlIHRvIHJlYWQgaW5vZGVzIik7CglpZiAoTk9STV9GSVJTVFpPTkUgIT0gRklSU1RaT05FKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBGaXJzdHpvbmUgIT0gTm9ybV9maXJzdHpvbmVcbiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9CglnZXRfZGlyc2l6ZSgpOwoJaWYgKHNob3cpIHsKCQlwcmludGYoIiVsZCBpbm9kZXNcbiIsIElOT0RFUyk7CgkJcHJpbnRmKCIlbGQgYmxvY2tzXG4iLCBaT05FUyk7CgkJcHJpbnRmKCJGaXJzdGRhdGF6b25lPSVsZCAoJWxkKVxuIiwgRklSU1RaT05FLCBOT1JNX0ZJUlNUWk9ORSk7CgkJcHJpbnRmKCJab25lc2l6ZT0lZFxuIiwgQkxPQ0tfU0laRSA8PCBaT05FU0laRSk7CgkJcHJpbnRmKCJNYXhzaXplPSVsZFxuIiwgTUFYU0laRSk7CgkJcHJpbnRmKCJGaWxlc3lzdGVtIHN0YXRlPSVkXG4iLCBTdXBlci5zX3N0YXRlKTsKCQlwcmludGYoIm5hbWVsZW49JWRcblxuIiwgbmFtZWxlbik7Cgl9Cn0KCnN0YXRpYyBzdHJ1Y3QgbWluaXhfaW5vZGUgKmdldF9pbm9kZSh1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peF9pbm9kZSAqaW5vZGU7CgoJaWYgKCFuciB8fCBuciA+IElOT0RFUykKCQlyZXR1cm4gTlVMTDsKCXRvdGFsKys7Cglpbm9kZSA9IElub2RlICsgbnI7CglpZiAoIWlub2RlX2NvdW50W25yXSkgewoJCWlmICghaW5vZGVfaW5fdXNlKG5yKSkgewoJCQlwcmludGYoIklub2RlICVkIG1hcmtlZCBub3QgdXNlZCwgYnV0IHVzZWQgZm9yIGZpbGUgJyIsIG5yKTsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiJ1xuIik7CgkJCWlmIChyZXBhaXIpIHsKCQkJCWlmIChhc2soIk1hcmsgaW4gdXNlIiwgMSkpCgkJCQkJbWFya19pbm9kZShucik7CgkJCX0gZWxzZSB7CgkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCIgaGFzIG1vZGUgJTA1b1xuIiwgaW5vZGUtPmlfbW9kZSk7CgkJfQoKCX0gZWxzZQoJCWxpbmtzKys7CglpZiAoISsraW5vZGVfY291bnRbbnJdKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBpbm9kZSBjb3VudCB0b28gYmlnLlxuIik7CgkJaW5vZGVfY291bnRbbnJdLS07CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCXJldHVybiBpbm9kZTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgc3RydWN0IG1pbml4Ml9pbm9kZSAqZ2V0X2lub2RlMih1bnNpZ25lZCBpbnQgbnIpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoKCWlmICghbnIgfHwgbnIgPiBJTk9ERVMpCgkJcmV0dXJuIE5VTEw7Cgl0b3RhbCsrOwoJaW5vZGUgPSBJbm9kZTIgKyBucjsKCWlmICghaW5vZGVfY291bnRbbnJdKSB7CgkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbWFya2VkIG5vdCB1c2VkLCBidXQgdXNlZCBmb3IgZmlsZSAnIiwgbnIpOwoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCInXG4iKTsKCQkJaWYgKHJlcGFpcikgewoJCQkJaWYgKGFzaygiTWFyayBpbiB1c2UiLCAxKSkKCQkJCQltYXJrX2lub2RlKG5yKTsKCQkJCWVsc2UKCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCQl9CgkJfQoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlkaXJlY3RvcnkrKzsKCQllbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQoJCQlyZWd1bGFyKys7CgkJZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSkKCQkJY2hhcmRldisrOwoJCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCgkJCWJsb2NrZGV2Kys7CgkJZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQkJc3ltbGlua3MrKzsKCQllbHNlIGlmIChTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSk7CgkJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpOwoJCWVsc2UgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCIgaGFzIG1vZGUgJTA1b1xuIiwgaW5vZGUtPmlfbW9kZSk7CgkJfQoJfSBlbHNlCgkJbGlua3MrKzsKCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKCQlwcmludGYoIldhcm5pbmc6IGlub2RlIGNvdW50IHRvbyBiaWcuXG4iKTsKCQlpbm9kZV9jb3VudFtucl0tLTsKCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJfQoJcmV0dXJuIGlub2RlOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgY2hlY2tfcm9vdCh2b2lkKQp7CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlID0gSW5vZGUgKyBST09UX0lOTzsKCglpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpCnsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgUk9PVF9JTk87CgoJaWYgKCFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYWRkX3pvbmUodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucih6bnIsIGNvcnJlY3RlZCk7CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKHpvbmVfY291bnRbYmxvY2tdKSB7CgkJcHJpbnRmKCJCbG9jayBoYXMgYmVlbiB1c2VkIGJlZm9yZS4gTm93IGluIGZpbGUgYCIpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJy4iKTsKCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCSp6bnIgPSAwOwoJCQlibG9jayA9IDA7CgkJCSpjb3JyZWN0ZWQgPSAxOwoJCX0KCX0KCWlmICghYmxvY2spCgkJcmV0dXJuIDA7CglpZiAoIXpvbmVfaW5fdXNlKGJsb2NrKSkgewoJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSBgIiwgYmxvY2spOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiJyBpcyBtYXJrZWQgbm90IGluIHVzZS4iKTsKCQlpZiAoYXNrKCJDb3JyZWN0IiwgMSkpCgkJCW1hcmtfem9uZShibG9jayk7Cgl9CglpZiAoISsrem9uZV9jb3VudFtibG9ja10pCgkJem9uZV9jb3VudFtibG9ja10tLTsKCXJldHVybiBibG9jazsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgaW50IGFkZF96b25lMih1bnNpZ25lZCBpbnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCWludCByZXN1bHQ7CglpbnQgYmxvY2s7CgoJcmVzdWx0ID0gMDsKCWJsb2NrID0gY2hlY2tfem9uZV9ucjIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm4gMDsKCWlmICh6b25lX2NvdW50W2Jsb2NrXSkgewoJCXByaW50ZigiQmxvY2sgaGFzIGJlZW4gdXNlZCBiZWZvcmUuIE5vdyBpbiBmaWxlIGAiKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicuIik7CgkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkqem5yID0gMDsKCQkJYmxvY2sgPSAwOwoJCQkqY29ycmVjdGVkID0gMTsKCQl9Cgl9CglpZiAoIWJsb2NrKQoJCXJldHVybiAwOwoJaWYgKCF6b25lX2luX3VzZShibG9jaykpIHsKCQlwcmludGYoIkJsb2NrICVkIGluIGZpbGUgYCIsIGJsb2NrKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIicgaXMgbWFya2VkIG5vdCBpbiB1c2UuIik7CgkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQoJCQltYXJrX3pvbmUoYmxvY2spOwoJfQoJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQoJCXpvbmVfY291bnRbYmxvY2tdLS07CglyZXR1cm4gYmxvY2s7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBjaGdfYmxrID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lKGkgKyAodW5zaWduZWQgc2hvcnQgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBhZGRfem9uZV9pbmQyKHVuc2lnbmVkIGludCAqem5yLCBpbnQgKmNvcnJlY3RlZCkKewoJc3RhdGljIGNoYXIgYmxrW0JMT0NLX1NJWkVdOwoJaW50IGksIGNoZ19ibGsgPSAwOwoJaW50IGJsb2NrOwoKCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKCQlhZGRfem9uZTIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmY2hnX2Jsayk7CglpZiAoY2hnX2JsaykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkIGFkZF96b25lX2RpbmQodW5zaWduZWQgc2hvcnQgKnpuciwgaW50ICpjb3JyZWN0ZWQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCWludCBpLCBibGtfY2hnID0gMDsKCWludCBibG9jazsKCglibG9jayA9IGFkZF96b25lKHpuciwgY29ycmVjdGVkKTsKCWlmICghYmxvY2spCgkJcmV0dXJuOwoJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKCWZvciAoaSA9IDA7IGkgPCAoQkxPQ0tfU0laRSA+PiAxKTsgaSsrKQoJCWFkZF96b25lX2luZChpICsgKHVuc2lnbmVkIHNob3J0ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2luZDIoaSArICh1bnNpZ25lZCBpbnQgKikgYmxrLCAmYmxrX2NoZyk7CglpZiAoYmxrX2NoZykKCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKfQoKc3RhdGljIHZvaWQgYWRkX3pvbmVfdGluZDIodW5zaWduZWQgaW50ICp6bnIsIGludCAqY29ycmVjdGVkKQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglpbnQgaSwgYmxrX2NoZyA9IDA7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBhZGRfem9uZTIoem5yLCBjb3JyZWN0ZWQpOwoJaWYgKCFibG9jaykKCQlyZXR1cm47CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQoJCWFkZF96b25lX2RpbmQyKGkgKyAodW5zaWduZWQgaW50ICopIGJsaywgJmJsa19jaGcpOwoJaWYgKGJsa19jaGcpCgkJd3JpdGVfYmxvY2soYmxvY2ssIGJsayk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja196b25lcyh1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4X2lub2RlICppbm9kZTsKCglpZiAoIWkgfHwgaSA+IElOT0RFUykKCQlyZXR1cm47CglpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLwoJCXJldHVybjsKCWlub2RlID0gSW5vZGUgKyBpOwoJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCgkJIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHJldHVybjsKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCgkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX2luZCg3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZCg4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX3pvbmVzMih1bnNpZ25lZCBpbnQgaSkKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CgoJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCgkJcmV0dXJuOwoJaWYgKGlub2RlX2NvdW50W2ldID4gMSkJCS8qIGhhdmUgd2UgY291bnRlZCB0aGlzIGZpbGUgYWxyZWFkeT8gKi8KCQlyZXR1cm47Cglpbm9kZSA9IElub2RlMiArIGk7CglpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkKCQkmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKCQlyZXR1cm47Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQoJCWFkZF96b25lMihpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfaW5kMig3ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOwoJYWRkX3pvbmVfZGluZDIoOCArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKCWFkZF96b25lX3RpbmQyKDkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBjaGVja19maWxlKHN0cnVjdCBtaW5peF9pbm9kZSAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQp7CglzdGF0aWMgY2hhciBibGtbQkxPQ0tfU0laRV07CglzdHJ1Y3QgbWluaXhfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2soZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKCXJlYWRfYmxvY2soYmxvY2ssIGJsayk7CgluYW1lID0gYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKCWlubyA9ICoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKTsKCWlmIChpbm8gPiBJTk9ERVMpIHsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlwcmludGYoIiBjb250YWlucyBhIGJhZCBpbm9kZSBudW1iZXIgZm9yIGZpbGUgJyIpOwoJCXByaW50ZigiJS4qcycuIiwgbmFtZWxlbiwgbmFtZSk7CgkJaWYgKGFzaygiIFJlbW92ZSIsIDEpKSB7CgkJCSoodW5zaWduZWQgc2hvcnQgKikgKG5hbWUgLSAyKSA9IDA7CgkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBibGspOwoJCX0KCQlpbm8gPSAwOwoJfQoJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpCgkJc3RybmNweShuYW1lX2xpc3RbbmFtZV9kZXB0aF0sIG5hbWUsIG5hbWVsZW4pOwoJbmFtZV9kZXB0aCsrOwoJaW5vZGUgPSBnZXRfaW5vZGUoaW5vKTsKCW5hbWVfZGVwdGgtLTsKCWlmICghb2Zmc2V0KSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4iLCBuYW1lKSkgewoJCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmIChvZmZzZXQgPT0gZGlyc2l6ZSkgewoJCWlmICghaW5vZGUgfHwgc3RyY21wKCIuLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIpOwoJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOwoJCX0gZWxzZQoJCQlyZXR1cm47Cgl9CglpZiAoIWlub2RlKQoJCXJldHVybjsKCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlmIChsaXN0KSB7CgkJaWYgKHZlcmJvc2UpCgkJCXByaW50ZigiJTZkICUwN28gJTNkICIsIGlubywgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmtzKTsKCQlwcmludF9jdXJyZW50X25hbWUoKTsKCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQkJcHJpbnRmKCI6XG4iKTsKCQllbHNlCgkJCXByaW50ZigiXG4iKTsKCX0KCWNoZWNrX3pvbmVzKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2soaW5vKTsKCW5hbWVfZGVwdGgtLTsKCXJldHVybjsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX01JTklYMgpzdGF0aWMgdm9pZCBjaGVja19maWxlMihzdHJ1Y3QgbWluaXgyX2lub2RlICpkaXIsIHVuc2lnbmVkIGludCBvZmZzZXQpCnsKCXN0YXRpYyBjaGFyIGJsa1tCTE9DS19TSVpFXTsKCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOwoJaW50IGlubzsKCWNoYXIgKm5hbWU7CglpbnQgYmxvY2s7CgoJYmxvY2sgPSBtYXBfYmxvY2syKGRpciwgb2Zmc2V0IC8gQkxPQ0tfU0laRSk7CglyZWFkX2Jsb2NrKGJsb2NrLCBibGspOwoJbmFtZSA9IGJsayArIChvZmZzZXQgJSBCTE9DS19TSVpFKSArIDI7Cglpbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMik7CglpZiAoaW5vID4gSU5PREVTKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCIgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICciKTsKCQlwcmludGYoIiUuKnMnLiIsIG5hbWVsZW4sIG5hbWUpOwoJCWlmIChhc2soIiBSZW1vdmUiLCAxKSkgewoJCQkqKHVuc2lnbmVkIHNob3J0ICopIChuYW1lIC0gMikgPSAwOwoJCQl3cml0ZV9ibG9jayhibG9jaywgYmxrKTsKCQl9CgkJaW5vID0gMDsKCX0KCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKQoJCXN0cm5jcHkobmFtZV9saXN0W25hbWVfZGVwdGhdLCBuYW1lLCBuYW1lbGVuKTsKCW5hbWVfZGVwdGgrKzsKCWlub2RlID0gZ2V0X2lub2RlMihpbm8pOwoJbmFtZV9kZXB0aC0tOwoJaWYgKCFvZmZzZXQpIHsKCQlpZiAoIWlub2RlIHx8IHN0cmNtcCgiLiIsIG5hbWUpKSB7CgkJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCQlwcmludGYoIjogYmFkIGRpcmVjdG9yeTogJy4nIGlzbid0IGZpcnN0XG4iKTsKCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCQl9IGVsc2UKCQkJcmV0dXJuOwoJfQoJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CgkJaWYgKCFpbm9kZSB8fCBzdHJjbXAoIi4uIiwgbmFtZSkpIHsKCQkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiAnLi4nIGlzbid0IHNlY29uZFxuIik7CgkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CgkJfSBlbHNlCgkJCXJldHVybjsKCX0KCWlmICghaW5vZGUpCgkJcmV0dXJuOwoJbmFtZV9kZXB0aCsrOwoJaWYgKGxpc3QpIHsKCQlpZiAodmVyYm9zZSkKCQkJcHJpbnRmKCIlNmQgJTA3byAlM2QgIiwgaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGlua3MpOwoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQoJCQlwcmludGYoIjpcbiIpOwoJCWVsc2UKCQkJcHJpbnRmKCJcbiIpOwoJfQoJY2hlY2tfem9uZXMyKGlubyk7CglpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKCQlyZWN1cnNpdmVfY2hlY2syKGlubyk7CgluYW1lX2RlcHRoLS07CglyZXR1cm47Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4X2lub2RlICpkaXI7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoKCWRpciA9IElub2RlICsgaW5vOwoJaWYgKCFTX0lTRElSKGRpci0+aV9tb2RlKSkKCQlkaWUoImludGVybmFsIGVycm9yIik7CglpZiAoZGlyLT5pX3NpemUgPCAyICogZGlyc2l6ZSkgewoJCXByaW50X2N1cnJlbnRfbmFtZSgpOwoJCXByaW50ZigiOiBiYWQgZGlyZWN0b3J5OiBzaXplPDMyIik7CgkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKCX0KCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQoJCWNoZWNrX2ZpbGUoZGlyLCBvZmZzZXQpOwp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW50IGlubykKewoJc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyOwoJdW5zaWduZWQgaW50IG9mZnNldDsKCglkaXIgPSBJbm9kZTIgKyBpbm87CglpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQoJCWRpZSgiaW50ZXJuYWwgZXJyb3IiKTsKCWlmIChkaXItPmlfc2l6ZSA8IDIgKiBkaXJzaXplKSB7CgkJcHJpbnRfY3VycmVudF9uYW1lKCk7CgkJcHJpbnRmKCI6IGJhZCBkaXJlY3Rvcnk6IHNpemUgPCAzMiIpOwoJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7Cgl9Cglmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBvZmZzZXQgKz0gZGlyc2l6ZSkKCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cn0KI2VuZGlmCgpzdGF0aWMgaW50IGJhZF96b25lKGludCBpKQp7CgljaGFyIGJ1ZmZlclsxMDI0XTsKCglpZiAoQkxPQ0tfU0laRSAqIGkgIT0gbHNlZWsoSU4sIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCkpCgkJZGllKCJzZWVrIGZhaWxlZCBpbiBiYWRfem9uZSIpOwoJcmV0dXJuIChCTE9DS19TSVpFICE9IHJlYWQoSU4sIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOwp9CgpzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICghaW5vZGVfaW5fdXNlKGkpICYmIElub2RlW2ldLmlfbW9kZSAmJiB3YXJuX21vZGUpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCBtb2RlIG5vdCBjbGVhcmVkLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CgkJCQlJbm9kZVtpXS5pX21vZGUgPSAwOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9CgkJaWYgKCFpbm9kZV9jb3VudFtpXSkgewoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIklub2RlICVkIG5vdCB1c2VkLCBtYXJrZWQgdXNlZCBpbiB0aGUgYml0bWFwLiIsIGkpOwoJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQoJCQkJdW5tYXJrX2lub2RlKGkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFpbm9kZV9pbl91c2UoaSkpIHsKCQkJcHJpbnRmKCJJbm9kZSAlZCB1c2VkLCBtYXJrZWQgdW51c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIlNldCIsIDEpKQoJCQkJbWFya19pbm9kZShpKTsKCQl9CgkJaWYgKElub2RlW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGUgPSAlMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuIiwKCQkJCSAgIGksIElub2RlW2ldLmlfbW9kZSwgSW5vZGVbaV0uaV9ubGlua3MsIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlW2ldLmlfbmxpbmtzID0gaW5vZGVfY291bnRbaV07CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCX0KCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKCQlpZiAoem9uZV9pbl91c2UoaSkgPT0gem9uZV9jb3VudFtpXSkKCQkJY29udGludWU7CgkJaWYgKCF6b25lX2NvdW50W2ldKSB7CgkJCWlmIChiYWRfem9uZShpKSkKCQkJCWNvbnRpbnVlOwoJCQlwcmludGYoIlpvbmUgJWQ6IG1hcmtlZCBpbiB1c2UsIG5vIGZpbGUgdXNlcyBpdC4iLCBpKTsKCQkJaWYgKGFzaygiVW5tYXJrIiwgMSkpCgkJCQl1bm1hcmtfem9uZShpKTsKCQkJY29udGludWU7CgkJfQoJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCgkJCSAgIGksIHpvbmVfaW5fdXNlKGkpID8gIiIgOiAibm90ICIsIHpvbmVfY291bnRbaV0pOwoJfQp9CgojaWZkZWYgQ09ORklHX0ZFQVRVUkVfTUlOSVgyCnN0YXRpYyB2b2lkIGNoZWNrX2NvdW50czIodm9pZCkKewoJaW50IGk7CgoJZm9yIChpID0gMTsgaSA8PSBJTk9ERVM7IGkrKykgewoJCWlmICghaW5vZGVfaW5fdXNlKGkpICYmIElub2RlMltpXS5pX21vZGUgJiYgd2Fybl9tb2RlKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgbW9kZSBub3QgY2xlYXJlZC4iLCBpKTsKCQkJaWYgKGFzaygiQ2xlYXIiLCAxKSkgewoJCQkJSW5vZGUyW2ldLmlfbW9kZSA9IDA7CgkJCQljaGFuZ2VkID0gMTsKCQkJfQoJCX0KCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CgkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQoJCQkJY29udGludWU7CgkJCXByaW50ZigiSW5vZGUgJWQgbm90IHVzZWQsIG1hcmtlZCB1c2VkIGluIHRoZSBiaXRtYXAuIiwgaSk7CgkJCWlmIChhc2soIkNsZWFyIiwgMSkpCgkJCQl1bm1hcmtfaW5vZGUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIWlub2RlX2luX3VzZShpKSkgewoJCQlwcmludGYoIklub2RlICVkIHVzZWQsIG1hcmtlZCB1bnVzZWQgaW4gdGhlIGJpdG1hcC4iLCBpKTsKCQkJaWYgKGFzaygiU2V0IiwgMSkpCgkJCQltYXJrX2lub2RlKGkpOwoJCX0KCQlpZiAoSW5vZGUyW2ldLmlfbmxpbmtzICE9IGlub2RlX2NvdW50W2ldKSB7CgkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGUgPSAlMDdvKSwgaV9ubGlua3M9JWQsIGNvdW50ZWQ9JWQuIiwKCQkJCSAgIGksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKCQkJCSAgIGlub2RlX2NvdW50W2ldKTsKCQkJaWYgKGFzaygiU2V0IGlfbmxpbmtzIHRvIGNvdW50IiwgMSkpIHsKCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOwoJCQkJY2hhbmdlZCA9IDE7CgkJCX0KCQl9Cgl9Cglmb3IgKGkgPSBGSVJTVFpPTkU7IGkgPCBaT05FUzsgaSsrKSB7CgkJaWYgKHpvbmVfaW5fdXNlKGkpID09IHpvbmVfY291bnRbaV0pCgkJCWNvbnRpbnVlOwoJCWlmICghem9uZV9jb3VudFtpXSkgewoJCQlpZiAoYmFkX3pvbmUoaSkpCgkJCQljb250aW51ZTsKCQkJcHJpbnRmKCJab25lICVkOiBtYXJrZWQgaW4gdXNlLCBubyBmaWxlIHVzZXMgaXQuIiwgaSk7CgkJCWlmIChhc2soIlVubWFyayIsIDEpKQoJCQkJdW5tYXJrX3pvbmUoaSk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwcmludGYoIlpvbmUgJWQ6ICVzaW4gdXNlLCBjb3VudGVkPSVkXG4iLAoJCQkgICBpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKCX0KfQojZW5kaWYKCnN0YXRpYyB2b2lkIGNoZWNrKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lcyhST09UX0lOTyk7CglyZWN1cnNpdmVfY2hlY2soUk9PVF9JTk8pOwoJY2hlY2tfY291bnRzKCk7Cn0KCiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKc3RhdGljIHZvaWQgY2hlY2syKHZvaWQpCnsKCW1lbXNldChpbm9kZV9jb3VudCwgMCwgKElOT0RFUyArIDEpICogc2l6ZW9mKCppbm9kZV9jb3VudCkpOwoJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CgljaGVja196b25lczIoUk9PVF9JTk8pOwoJcmVjdXJzaXZlX2NoZWNrMihST09UX0lOTyk7CgljaGVja19jb3VudHMyKCk7Cn0KI2VuZGlmCgovKiBXZWQgRmViICA5IDE1OjE3OjA2IE1TVCAyMDAwICovCi8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlIG5hbWVfbGlzdCAoaW5zdGVhZCBvZiBtYWtpbmcgaXQgc3RhdGljKSAqLwpzdGF0aWMgdm9pZCBhbGxvY19uYW1lX2xpc3Qodm9pZCkKewoJaW50IGk7CgoJbmFtZV9saXN0ID0geG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIE1BWF9ERVBUSCk7Cglmb3IgKGkgPSAwOyBpIDwgTUFYX0RFUFRIOyBpKyspCgkJbmFtZV9saXN0W2ldID0geG1hbGxvYyhzaXplb2YoY2hhcikgKiBCVUZTSVogKyAxKTsKfQoKI2lmZGVmIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQCi8qIGV4ZWN1dGUgdGhpcyBhdGV4aXQoKSB0byBkZWFsbG9jYXRlIG5hbWVfbGlzdFtdICovCi8qIHBpcHRpZ2dlciB3YXMgaGVyZSAqLwpzdGF0aWMgdm9pZCBmcmVlX25hbWVfbGlzdCh2b2lkKQp7CglpbnQgaTsKCglpZiAobmFtZV9saXN0KSB7CgkJZm9yIChpID0gMDsgaSA8IE1BWF9ERVBUSDsgaSsrKSB7CgkJCWZyZWUobmFtZV9saXN0W2ldKTsKCQl9CgkJZnJlZShuYW1lX2xpc3QpOwoJfQp9CiNlbmRpZgoKZXh0ZXJuIGludCBmc2NrX21pbml4X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglzdHJ1Y3QgdGVybWlvcyB0bXA7CglpbnQgY291bnQ7CglpbnQgcmV0Y29kZSA9IDA7CgoJYWxsb2NfbmFtZV9saXN0KCk7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUAoJLyogRG9uJ3QgYm90aGVyIHRvIGZyZWUgbWVtb3J5LiAgRXhpdCBkb2VzCgkgKiB0aGF0IGF1dG9tYWdpY2FsbHksIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCglhdGV4aXQoZnJlZV9uYW1lX2xpc3QpOwojZW5kaWYKCglpZiAoSU5PREVfU0laRSAqIE1JTklYX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkKCQlkaWUoImJhZCBpbm9kZSBzaXplIik7CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKCWlmIChJTk9ERV9TSVpFMiAqIE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLICE9IEJMT0NLX1NJWkUpCgkJZGllKCJiYWQgdjIgaW5vZGUgc2l6ZSIpOwojZW5kaWYKCXdoaWxlIChhcmdjLS0gPiAxKSB7CgkJYXJndisrOwoJCWlmIChhcmd2WzBdWzBdICE9ICctJykgewoJCQlpZiAoZGV2aWNlX25hbWUpCgkJCQliYl9zaG93X3VzYWdlKCk7CgkJCWVsc2UKCQkJCWRldmljZV9uYW1lID0gYXJndlswXTsKCQl9IGVsc2UKCQkJd2hpbGUgKCorK2FyZ3ZbMF0pCgkJCQlzd2l0Y2ggKGFyZ3ZbMF1bMF0pIHsKCQkJCWNhc2UgJ2wnOgoJCQkJCWxpc3QgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAnYSc6CgkJCQkJYXV0b21hdGljID0gMTsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAncic6CgkJCQkJYXV0b21hdGljID0gMDsKCQkJCQlyZXBhaXIgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAndic6CgkJCQkJdmVyYm9zZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdzJzoKCQkJCQlzaG93ID0gMTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ20nOgoJCQkJCXdhcm5fbW9kZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdmJzoKCQkJCQlmb3JjZSA9IDE7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKCQkJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpCgkJYmJfc2hvd191c2FnZSgpOwoJY2hlY2tfbW91bnQoKTsJCQkJLyogdHJ5aW5nIHRvIGNoZWNrIGEgbW91bnRlZCBmaWxlc3lzdGVtPyAqLwoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKSB7CgkJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSkKCQkJZGllKCJuZWVkIHRlcm1pbmFsIGZvciBpbnRlcmFjdGl2ZSByZXBhaXJzIik7Cgl9CglJTiA9IG9wZW4oZGV2aWNlX25hbWUsIHJlcGFpciA/IE9fUkRXUiA6IE9fUkRPTkxZKTsKCWlmIChJTiA8IDApewoJCWZwcmludGYoc3RkZXJyLCJ1bmFibGUgdG8gb3BlbiBkZXZpY2UgJyVzJy5cbiIsZGV2aWNlX25hbWUpOwoJCWxlYXZlKDgpOwoJfQoJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzsgY291bnQrKykKCQlzeW5jKCk7CglyZWFkX3N1cGVyYmxvY2soKTsKCgkvKgoJICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjb250aW51ZSB3aXRoIHRoZSBjaGVja2luZy4KCSAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIHN0YXR1cyBvZiB0aGUgZmlsZXN5c3RlbSB2YWxpZCBhbmQgZXJyb3IKCSAqIGZsYWdzIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgLWYgc3dpdGNoIHdhcyBzcGVjaWZpZWQgb24gdGhlCgkgKiBjb21tYW5kIGxpbmUuCgkgKi8KCXByaW50ZigiJXMsICVzXG4iLCBiYl9hcHBsZXRfbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKCWlmICghKFN1cGVyLnNfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykgJiYKCQkoU3VwZXIuc19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSAmJiAhZm9yY2UpIHsKCQlpZiAocmVwYWlyKQoJCQlwcmludGYoIiVzIGlzIGNsZWFuLCBubyBjaGVjay5cbiIsIGRldmljZV9uYW1lKTsKCQlyZXR1cm4gcmV0Y29kZTsKCX0gZWxzZSBpZiAoZm9yY2UpCgkJcHJpbnRmKCJGb3JjaW5nIGZpbGVzeXN0ZW0gY2hlY2sgb24gJXMuXG4iLCBkZXZpY2VfbmFtZSk7CgllbHNlIGlmIChyZXBhaXIpCgkJcHJpbnRmKCJGaWxlc3lzdGVtIG9uICVzIGlzIGRpcnR5LCBuZWVkcyBjaGVja2luZy5cbiIsCgkJCSAgIGRldmljZV9uYW1lKTsKCglyZWFkX3RhYmxlcygpOwoKCWlmIChyZXBhaXIgJiYgIWF1dG9tYXRpYykgewoJCXRjZ2V0YXR0cigwLCAmdGVybWlvcyk7CgkJdG1wID0gdGVybWlvczsKCQl0bXAuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOwoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdG1wKTsKCQl0ZXJtaW9zX3NldCA9IDE7Cgl9CiNpZmRlZiBDT05GSUdfRkVBVFVSRV9NSU5JWDIKCWlmICh2ZXJzaW9uMikgewoJCWNoZWNrX3Jvb3QyKCk7CgkJY2hlY2syKCk7Cgl9IGVsc2UKI2VuZGlmCgl7CgkJY2hlY2tfcm9vdCgpOwoJCWNoZWNrKCk7Cgl9CglpZiAodmVyYm9zZSkgewoJCWludCBpLCBmcmVlX2NudDsKCgkJZm9yIChpID0gMSwgZnJlZV9jbnQgPSAwOyBpIDw9IElOT0RFUzsgaSsrKQoJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKCQkJCWZyZWVfY250Kys7CgkJcHJpbnRmKCJcbiU2bGQgaW5vZGVzIHVzZWQgKCVsZCUlKVxuIiwgKElOT0RFUyAtIGZyZWVfY250KSwKCQkJICAgMTAwICogKElOT0RFUyAtIGZyZWVfY250KSAvIElOT0RFUyk7CgkJZm9yIChpID0gRklSU1RaT05FLCBmcmVlX2NudCA9IDA7IGkgPCBaT05FUzsgaSsrKQoJCQlpZiAoIXpvbmVfaW5fdXNlKGkpKQoJCQkJZnJlZV9jbnQrKzsKCQlwcmludGYoIiU2bGQgem9uZXMgdXNlZCAoJWxkJSUpXG4iLCAoWk9ORVMgLSBmcmVlX2NudCksCgkJCSAgIDEwMCAqIChaT05FUyAtIGZyZWVfY250KSAvIFpPTkVTKTsKCQlwcmludGYoIlxuJTZkIHJlZ3VsYXIgZmlsZXNcbiIKCQkJICAgIiU2ZCBkaXJlY3Rvcmllc1xuIgoJCQkgICAiJTZkIGNoYXJhY3RlciBkZXZpY2UgZmlsZXNcbiIKCQkJICAgIiU2ZCBibG9jayBkZXZpY2UgZmlsZXNcbiIKCQkJICAgIiU2ZCBsaW5rc1xuIgoJCQkgICAiJTZkIHN5bWJvbGljIGxpbmtzXG4iCgkJCSAgICItLS0tLS1cbiIKCQkJICAgIiU2ZCBmaWxlc1xuIiwKCQkJICAgcmVndWxhciwgZGlyZWN0b3J5LCBjaGFyZGV2LCBibG9ja2RldiwKCQkJICAgbGlua3MgLSAyICogZGlyZWN0b3J5ICsgMSwgc3ltbGlua3MsCgkJCSAgIHRvdGFsIC0gMiAqIGRpcmVjdG9yeSArIDEpOwoJfQoJaWYgKGNoYW5nZWQpIHsKCQl3cml0ZV90YWJsZXMoKTsKCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKCQkJICAgIkZJTEUgU1lTVEVNIEhBUyBCRUVOIENIQU5HRURcbiIKCQkJICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyspCgkJCXN5bmMoKTsKCX0gZWxzZSBpZiAocmVwYWlyKQoJCXdyaXRlX3N1cGVyX2Jsb2NrKCk7CgoJaWYgKHJlcGFpciAmJiAhYXV0b21hdGljKQoJCXRjc2V0YXR0cigwLCBUQ1NBTk9XLCAmdGVybWlvcyk7CgoJaWYgKGNoYW5nZWQpCgkJcmV0Y29kZSArPSAzOwoJaWYgKGVycm9yc191bmNvcnJlY3RlZCkKCQlyZXRjb2RlICs9IDQ7CglyZXR1cm4gcmV0Y29kZTsKfQo=