I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiNpbmNsdWRlIDxhc20vdGltZXIuaD4KCiNpbmNsdWRlICJjcHUuaCIKCi8qCiAqIFJlYWQgTlNDL0N5cml4IERFVklEIHJlZ2lzdGVycyAoRElSKSB0byBnZXQgbW9yZSBkZXRhaWxlZCBpbmZvLiBhYm91dCB0aGUgQ1BVCiAqLwp2b2lkIF9faW5pdCBkb19jeXJpeF9kZXZpZCh1bnNpZ25lZCBjaGFyICpkaXIwLCB1bnNpZ25lZCBjaGFyICpkaXIxKQp7Cgl1bnNpZ25lZCBjaGFyIGNjcjIsIGNjcjM7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJCgkvKiB3ZSB0ZXN0IGZvciBERVZJRCBieSBjaGVja2luZyB3aGV0aGVyIENDUjMgaXMgd3JpdGFibGUgKi8KCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CglzZXRDeDg2KENYODZfQ0NSMywgY2NyMyBeIDB4ODApOwoJZ2V0Q3g4NigweGMwKTsgICAvKiBkdW1teSB0byBjaGFuZ2UgYnVzICovCgoJaWYgKGdldEN4ODYoQ1g4Nl9DQ1IzKSA9PSBjY3IzKSB7ICAgICAgIC8qIG5vIERFVklEIHJlZ3MuICovCgkJY2NyMiA9IGdldEN4ODYoQ1g4Nl9DQ1IyKTsKCQlzZXRDeDg2KENYODZfQ0NSMiwgY2NyMiBeIDB4MDQpOwoJCWdldEN4ODYoMHhjMCk7ICAvKiBkdW1teSAqLwoKCQlpZiAoZ2V0Q3g4NihDWDg2X0NDUjIpID09IGNjcjIpIC8qIG9sZCBDeDQ4NlNMQy9ETEMgKi8KCQkJKmRpcjAgPSAweGZkOwoJCWVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3g0ODZTIEEgc3RlcCAqLwoJCQlzZXRDeDg2KENYODZfQ0NSMiwgY2NyMik7CgkJCSpkaXIwID0gMHhmZTsKCQl9Cgl9CgllbHNlIHsKCQlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7ICAvKiByZXN0b3JlIENDUjMgKi8KCgkJLyogcmVhZCBESVIwIGFuZCBESVIxIENQVSByZWdpc3RlcnMgKi8KCQkqZGlyMCA9IGdldEN4ODYoQ1g4Nl9ESVIwKTsKCQkqZGlyMSA9IGdldEN4ODYoQ1g4Nl9ESVIxKTsKCX0KCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKfQoKLyoKICogQ3g4Nl9kaXIwX21zYiBpcyBhIEhBQ0sgbmVlZGVkIGJ5IGNoZWNrX2N4Njg2X2NwdWlkL3Nsb3AgaW4gYnVncy5oIGluCiAqIG9yZGVyIHRvIGlkZW50aWZ5IHRoZSBDeXJpeCBDUFUgbW9kZWwgYWZ0ZXIgd2UncmUgb3V0IG9mIHNldHVwLmMKICoKICogQWN0dWFsbHkgc2luY2UgYnVncy5oIGRvZXNuJ3QgZXZlbiByZWZlcmVuY2UgdGhpcyBwZXJoYXBzIHNvbWVvbmUgc2hvdWxkCiAqIGZpeCB0aGUgZG9jdW1lbnRhdGlvbiA/Pz8KICovCnN0YXRpYyB1bnNpZ25lZCBjaGFyIEN4ODZfZGlyMF9tc2IgX19pbml0ZGF0YSA9IDA7CgpzdGF0aWMgY2hhciBDeDg2X21vZGVsW11bOV0gX19pbml0ZGF0YSA9IHsKCSJDeDQ4NiIsICJDeDQ4NiIsICI1eDg2ICIsICI2eDg2IiwgIk1lZGlhR1ggIiwgIjZ4ODZNWCAiLAoJIk0gSUkgIiwgIlVua25vd24iCn07CnN0YXRpYyBjaGFyIEN4NDg2X25hbWVbXVs1XSBfX2luaXRkYXRhID0gewoJIlNMQyIsICJETEMiLCAiU0xDMiIsICJETEMyIiwgIlNSeCIsICJEUngiLAoJIlNSeDIiLCAiRFJ4MiIKfTsKc3RhdGljIGNoYXIgQ3g0ODZTX25hbWVbXVs0XSBfX2luaXRkYXRhID0gewoJIlMiLCAiUzIiLCAiU2UiLCAiUzJlIgp9OwpzdGF0aWMgY2hhciBDeDQ4NkRfbmFtZVtdWzRdIF9faW5pdGRhdGEgPSB7CgkiRFgiLCAiRFgyIiwgIj8iLCAiPyIsICI/IiwgIkRYNCIKfTsKc3RhdGljIGNoYXIgQ3g4Nl9jYltdIF9faW5pdGRhdGEgPSAiPy41eCBDb3JlL0J1cyBDbG9jayI7CnN0YXRpYyBjaGFyIGN5cml4X21vZGVsX211bHQxW10gX19pbml0ZGF0YSA9ICIxMj8/NDMiOwpzdGF0aWMgY2hhciBjeXJpeF9tb2RlbF9tdWx0MltdIF9faW5pdGRhdGEgPSAiMTIyMzM0NDUiOwoKLyoKICogUmVzZXQgdGhlIHNsb3ctbG9vcCAoU0xPUCkgYml0IG9uIHRoZSA2ODYoTCkgd2hpY2ggaXMgc2V0IGJ5IHNvbWUgb2xkCiAqIEJJT1NlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIERPUyBnYW1lcy4gIFRoaXMgbWFrZXMgdGhlIHVkZWxheSBsb29wCiAqIHdvcmsgY29ycmVjdGx5LCBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UuCiAqCiAqIEZJWE1FOiBvdXIgbmV3ZXIgdWRlbGF5IHVzZXMgdGhlIHRzYy4gV2UgZG9uJ3QgbmVlZCB0byBmcm9iIHdpdGggU0xPUAogKi8KCmV4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKSBfX2luaXQ7CgpzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfY3g2ODZfc2xvcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkKCWlmIChDeDg2X2RpcjBfbXNiID09IDMpIHsKCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjU7CgoJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKCQljY3IzID0gZ2V0Q3g4NihDWDg2X0NDUjMpOwoJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTiAgKi8KCQljY3I1ID0gZ2V0Q3g4NihDWDg2X0NDUjUpOwoJCWlmIChjY3I1ICYgMikKCQkJc2V0Q3g4NihDWDg2X0NDUjUsIGNjcjUgJiAweGZkKTsgIC8qIHJlc2V0IFNMT1AgKi8KCQlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7ICAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIE1BUEVOICovCgkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwoKCQlpZiAoY2NyNSAmIDIpIHsgLyogcG9zc2libGUgd3JvbmcgY2FsaWJyYXRpb24gZG9uZSAqLwoJCQlwcmludGsoS0VSTl9JTkZPICJSZWNhbGlicmF0aW5nIGRlbGF5IGxvb3Agd2l0aCBTTE9QIGJpdCByZXNldFxuIik7CgkJCWNhbGlicmF0ZV9kZWxheSgpOwoJCQljLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CgkJfQoJfQp9CgoKc3RhdGljIHZvaWQgX19pbml0IHNldF9jeDg2X3Jlb3JkZXIodm9pZCkKewoJdTggY2NyMzsKCglwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5IGFjY2VzcyByZW9yZGVyIG9uIEN5cml4L05TQyBwcm9jZXNzb3IuXG4iKTsKCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CglzZXRDeDg2KENYODZfQ0NSMywgKGNjcjMgJiAweDBmKSB8IDB4MTApOyAvKiBlbmFibGUgTUFQRU6gICovCgoJLyogTG9hZC9TdG9yZSBTZXJpYWxpemUgdG8gbWVtIGFjY2VzcyBkaXNhYmxlICg9cmVvcmRlciBpdCmgICovCglzZXRDeDg2KENYODZfUENSMCwgZ2V0Q3g4NihDWDg2X1BDUjApICYgfjB4ODApOwoJLyogc2V0IGxvYWQvc3RvcmUgc2VyaWFsaXplIGZyb20gMUdCIHRvIDRHQiAqLwoJY2NyMyB8PSAweGUwOwoJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOwp9CgpzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2N4ODZfbWVtd2Iodm9pZCkKewoJdTMyIGNyMDsKCglwcmludGsoS0VSTl9JTkZPICJFbmFibGUgTWVtb3J5LVdyaXRlLWJhY2sgbW9kZSBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CgoJLyogQ0NSMiBiaXQgMjogdW5sb2NrIE5XIGJpdCAqLwoJc2V0Q3g4NihDWDg2X0NDUjIsIGdldEN4ODYoQ1g4Nl9DQ1IyKSAmIH4weDA0KTsKCS8qIHNldCAnTm90IFdyaXRlLXRocm91Z2gnICovCgljcjAgPSAweDIwMDAwMDAwOwoJX19hc21fXygibW92bCAlJWNyMCwlJWVheFxuXHQiCgkJIm9ybCAlMCwlJWVheFxuXHQiCgkJIm1vdmwgJSVlYXgsJSVjcjBcbiIKCQk6IDogInIiIChjcjApCgkJOiJheCIpOwoJLyogQ0NSMiBiaXQgMjogbG9jayBOVyBiaXQgYW5kIHNldCBXVDEgKi8KCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgfCAweDE0ICk7Cn0KCnN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9pbmModm9pZCkKewoJdW5zaWduZWQgY2hhciBjY3IzOwoKCXByaW50ayhLRVJOX0lORk8gIkVuYWJsZSBJbmNyZW1lbnRvciBvbiBDeXJpeC9OU0MgcHJvY2Vzc29yLlxuIik7CgoJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTqAgKi8KCS8qIFBDUjEgLS0gUGVyZm9ybWFuY2UgQ29udHJvbCAqLwoJLyogSW5jcmVtZW50b3Igb24sIHdoYXRldmVyIHRoYXQgaXMgKi8KCXNldEN4ODYoQ1g4Nl9QQ1IxLCBnZXRDeDg2KENYODZfUENSMSkgfCAweDAyKTsKCS8qIFBDUjAgLS0gUGVyZm9ybWFuY2UgQ29udHJvbCAqLwoJLyogSW5jcmVtZW50b3IgTWFyZ2luIDEwICovCglzZXRDeDg2KENYODZfUENSMCwgZ2V0Q3g4NihDWDg2X1BDUjApIHwgMHgwNCk7IAoJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOwkvKiBkaXNhYmxlIE1BUEVOICovCn0KCi8qCiAqCUNvbmZpZ3VyZSBsYXRlciBNZWRpYUdYIGFuZC9vciBHZW9kZSBwcm9jZXNzb3IuCiAqLwoKc3RhdGljIHZvaWQgX19pbml0IGdlb2RlX2NvbmZpZ3VyZSh2b2lkKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdTggY2NyMywgY2NyNDsKCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKCgkvKiBTdXNwZW5kIG9uIGhhbHQgcG93ZXIgc2F2aW5nIGFuZCBlbmFibGUgI1NVU1AgcGluICovCglzZXRDeDg2KENYODZfQ0NSMiwgZ2V0Q3g4NihDWDg2X0NDUjIpIHwgMHg4OCk7CgoJY2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7CS8qIEVuYWJsZSAqLwoJCgljY3I0ID0gZ2V0Q3g4NihDWDg2X0NDUjQpOwoJY2NyNCB8PSAweDM4OwkJLyogRlBVIGZhc3QsIERURSBjYWNoZSwgTWVtIGJ5cGFzcyAqLwoJCglzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7CgkKCXNldF9jeDg2X21lbXdiKCk7CglzZXRfY3g4Nl9yZW9yZGVyKCk7CQoJc2V0X2N4ODZfaW5jKCk7CgkKCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKfQoKCiNpZmRlZiBDT05GSUdfUENJCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeXJpeF81NXgwW10gPSB7Cgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DWVJJWCwgUENJX0RFVklDRV9JRF9DWVJJWF81NTEwKSB9LAoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCkgfSwKCXsgfSwKfTsKI2VuZGlmCgpzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9jeXJpeChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCnsKCXVuc2lnbmVkIGNoYXIgZGlyMCwgZGlyMF9tc24sIGRpcjBfbHNuLCBkaXIxID0gMDsKCWNoYXIgKmJ1ZiA9IGMtPng4Nl9tb2RlbF9pZDsKCWNvbnN0IGNoYXIgKnAgPSBOVUxMOwoKCS8qIEJpdCAzMSBpbiBub3JtYWwgQ1BVSUQgdXNlZCBmb3Igbm9uc3RhbmRhcmQgM0ROb3cgSUQ7CgkgICAzRE5vdyBpcyBJRGQgYnkgYml0IDMxIGluIGV4dGVuZGVkIENQVUlEICgxKjMyKzMxKSBhbnl3YXkgKi8KCWNsZWFyX2JpdCgwKjMyKzMxLCBjLT54ODZfY2FwYWJpbGl0eSk7CgoJLyogQ3lyaXggdXNlZCBiaXQgMjQgaW4gZXh0ZW5kZWQgKEFNRCkgQ1BVSUQgZm9yIEN5cml4IE1NWCBleHRlbnNpb25zICovCglpZiAoIHRlc3RfYml0KDEqMzIrMjQsIGMtPng4Nl9jYXBhYmlsaXR5KSApIHsKCQljbGVhcl9iaXQoMSozMisyNCwgYy0+eDg2X2NhcGFiaWxpdHkpOwoJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1hNTVgsIGMtPng4Nl9jYXBhYmlsaXR5KTsKCX0KCglkb19jeXJpeF9kZXZpZCgmZGlyMCwgJmRpcjEpOwoKCWNoZWNrX2N4Njg2X3Nsb3AoYyk7CgoJQ3g4Nl9kaXIwX21zYiA9IGRpcjBfbXNuID0gZGlyMCA+PiA0OyAvKiBpZGVudGlmaWVzIENQVSAiZmFtaWx5IiAgICovCglkaXIwX2xzbiA9IGRpcjAgJiAweGY7ICAgICAgICAgICAgICAgIC8qIG1vZGVsIG9yIGNsb2NrIG11bHRpcGxpZXIgKi8KCgkvKiBjb21tb24gY2FzZSBzdGVwIG51bWJlci9yZXYgLS0gZXhjZXB0aW9ucyBoYW5kbGVkIGJlbG93ICovCgljLT54ODZfbW9kZWwgPSAoZGlyMSA+PiA0KSArIDE7CgljLT54ODZfbWFzayA9IGRpcjEgJiAweGY7CgoJLyogTm93IGNvb2s7IHRoZSBvcmlnaW5hbCByZWNpcGUgaXMgYnkgQ2hhbm5pbmcgQ29ybiwgZnJvbSBDeXJpeC4KCSAqIFdlIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBlYWNoIGdlbmVyYXRpb246IHdlIHdvcmsgb3V0CgkgKiB0aGUgbW9kZWwsIG11bHRpcGxpZXIgYW5kIHN0ZXBwaW5nLiAgQmxhY2sgbWFnaWMgaW5jbHVkZWQsCgkgKiB0byBtYWtlIHRoZSBzaWxpY29uIHN0ZXAvcmV2IG51bWJlcnMgbWF0Y2ggdGhlIHByaW50ZWQgb25lcy4KCSAqLwoJIAoJc3dpdGNoIChkaXIwX21zbikgewoJCXVuc2lnbmVkIGNoYXIgdG1wOwoKCWNhc2UgMDogLyogQ3g0ODZTTEMvRExDL1NSeC9EUnggKi8KCQlwID0gQ3g0ODZfbmFtZVtkaXIwX2xzbiAmIDddOwoJCWJyZWFrOwoKCWNhc2UgMTogLyogQ3g0ODZTL0RYL0RYMi9EWDQgKi8KCQlwID0gKGRpcjBfbHNuICYgOCkgPyBDeDQ4NkRfbmFtZVtkaXIwX2xzbiAmIDVdCgkJCTogQ3g0ODZTX25hbWVbZGlyMF9sc24gJiAzXTsKCQlicmVhazsKCgljYXNlIDI6IC8qIDV4ODYgKi8KCQlDeDg2X2NiWzJdID0gY3lyaXhfbW9kZWxfbXVsdDFbZGlyMF9sc24gJiA1XTsKCQlwID0gQ3g4Nl9jYisyOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogNng4Ni82eDg2TCAqLwoJCUN4ODZfY2JbMV0gPSAnICc7CgkJQ3g4Nl9jYlsyXSA9IGN5cml4X21vZGVsX211bHQxW2RpcjBfbHNuICYgNV07CgkJaWYgKGRpcjEgPiAweDIxKSB7IC8qIDY4NkwgKi8KCQkJQ3g4Nl9jYlswXSA9ICdMJzsKCQkJcCA9IEN4ODZfY2I7CgkJCShjLT54ODZfbW9kZWwpKys7CgkJfSBlbHNlICAgICAgICAgICAgIC8qIDY4NiAqLwoJCQlwID0gQ3g4Nl9jYisxOwoJCS8qIEVtdWxhdGUgTVRSUnMgdXNpbmcgQ3lyaXgncyBBUlJzLiAqLwoJCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1lSSVhfQVJSLCBjLT54ODZfY2FwYWJpbGl0eSk7CgkJLyogNng4NidzIGNvbnRhaW4gdGhpcyBidWcgKi8KCQljLT5jb21hX2J1ZyA9IDE7CgkJYnJlYWs7CgoJY2FzZSA0OiAvKiBNZWRpYUdYL0dYbSBvciBHZW9kZSBHWE0vR1hMVi9HWDEgKi8KI2lmZGVmIENPTkZJR19QQ0kKCQkvKiBJdCBpc24ndCByZWFsbHkgYSBQQ0kgcXVpcmsgZGlyZWN0bHksIGJ1dCB0aGUgY3VyZSBpcyB0aGUKCQkgICBzYW1lLiBUaGUgTWVkaWFHWCBoYXMgZGVlcCBtYWdpYyBTTU0gc3R1ZmYgdGhhdCBoYW5kbGVzIHRoZQoJCSAgIFNCIGVtdWxhdGlvbi4gSXQgdGhvd3MgYXdheSB0aGUgZmlmbyBvbiBkaXNhYmxlX2RtYSgpIHdoaWNoCgkJICAgaXMgd3JvbmcgYW5kIHJ1aW5zIHRoZSBhdWRpby4gCgoJCSAgIEJ1ZzI6IFZTQTEgaGFzIGEgd3JhcCBidWcgc28gdGhhdCB1c2luZyBtYXhpbXVtIHNpemVkIERNQSAKCQkgICBjYXVzZXMgYmFkIHRoaW5ncy4gQWNjb3JkaW5nIHRvIE5hdFNlbWkgVlNBMiBoYXMgYW5vdGhlcgoJCSAgIGJ1ZyB0byBkbyB3aXRoICdobHQnLiBJJ3ZlIG5vdCBzZWVuIGFueSBib2FyZHMgdXNpbmcgVlNBMgoJCSAgIGFuZCBYIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IGl0IGVpdGhlciBzbyB3aG8gY2FyZXMgOCkuCgkJICAgVlNBMSB3ZSB3b3JrIGFyb3VuZCBob3dldmVyLgoJCSovCgoJCXByaW50ayhLRVJOX0lORk8gIldvcmtpbmcgYXJvdW5kIEN5cml4IE1lZGlhR1ggdmlydHVhbCBETUEgYnVncy5cbiIpOwoJCWlzYV9kbWFfYnJpZGdlX2J1Z2d5ID0gMjsKI2VuZGlmCQkKCQljLT54ODZfY2FjaGVfc2l6ZT0xNjsJLyogWWVwIDE2SyBpbnRlZ3JhdGVkIGNhY2hlIHRoYXRzIGl0ICovCiAKCQkvKgoJCSAqICBUaGUgNTUxMC81NTIwIGNvbXBhbmlvbiBjaGlwcyBoYXZlIGEgZnVua3kgUElULgoJCSAqLyAgCgkJaWYgKHBjaV9kZXZfcHJlc2VudChjeXJpeF81NXgwKSkKCQkJcGl0X2xhdGNoX2J1Z2d5ID0gMTsKCgkJLyogR1htIHN1cHBvcnRzIGV4dGVuZGVkIGNwdWlkIGxldmVscyAnYWxhJyBBTUQgKi8KCQlpZiAoYy0+Y3B1aWRfbGV2ZWwgPT0gMikgewoJCQkvKiBFbmFibGUgY3hNTVggZXh0ZW5zaW9ucyAoR1gxIERhdGFzaGVldCA1NCkgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KXwxKTsKCQkJCgkJCS8qIEdYbHYvR1htL0dYMSAqLwoJCQlpZigoZGlyMSA+PSAweDUwICYmIGRpcjEgPD0gMHg1NCkgfHwgZGlyMSA+PSAweDYzKQoJCQkJZ2VvZGVfY29uZmlndXJlKCk7CgkJCWdldF9tb2RlbF9uYW1lKGMpOyAgLyogZ2V0IENQVSBtYXJrZXRpbmcgbmFtZSAqLwoJCQlyZXR1cm47CgkJfQoJCWVsc2UgeyAgLyogTWVkaWFHWCAqLwoJCQlDeDg2X2NiWzJdID0gKGRpcjBfbHNuICYgMSkgPyAnMycgOiAnNCc7CgkJCXAgPSBDeDg2X2NiKzI7CgkJCWMtPng4Nl9tb2RlbCA9IChkaXIxICYgMHgyMCkgPyAxIDogMjsKCQl9CgkJYnJlYWs7CgogICAgICAgIGNhc2UgNTogLyogNng4Nk1YL00gSUkgKi8KCQlpZiAoZGlyMSA+IDcpCgkJewoJCQlkaXIwX21zbisrOyAgLyogTSBJSSAqLwoJCQkvKiBFbmFibGUgTU1YIGV4dGVuc2lvbnMgKEFwcCBub3RlIDEwOCkgKi8KCQkJc2V0Q3g4NihDWDg2X0NDUjcsIGdldEN4ODYoQ1g4Nl9DQ1I3KXwxKTsKCQl9CgkJZWxzZQoJCXsKCQkJYy0+Y29tYV9idWcgPSAxOyAgICAgIC8qIDZ4ODZNWCwgaXQgaGFzIHRoZSBidWcuICovCgkJfQoJCXRtcCA9ICghKGRpcjBfbHNuICYgNykgfHwgZGlyMF9sc24gJiAxKSA/IDIgOiAwOwoJCUN4ODZfY2JbdG1wXSA9IGN5cml4X21vZGVsX211bHQyW2RpcjBfbHNuICYgN107CgkJcCA9IEN4ODZfY2IrdG1wOwogICAgICAgIAlpZiAoKChkaXIxICYgMHgwZikgPiA0KSB8fCAoKGRpcjEgJiAweGYwKSA9PSAweDIwKSkKCQkJKGMtPng4Nl9tb2RlbCkrKzsKCQkvKiBFbXVsYXRlIE1UUlJzIHVzaW5nIEN5cml4J3MgQVJScy4gKi8KCQlzZXRfYml0KFg4Nl9GRUFUVVJFX0NZUklYX0FSUiwgYy0+eDg2X2NhcGFiaWxpdHkpOwoJCWJyZWFrOwoKCWNhc2UgMHhmOiAgLyogQ3lyaXggNDg2IHdpdGhvdXQgREVWSUQgcmVnaXN0ZXJzICovCgkJc3dpdGNoIChkaXIwX2xzbikgewoJCWNhc2UgMHhkOiAgLyogZWl0aGVyIGEgNDg2U0xDIG9yIERMQyB3L28gREVWSUQgKi8KCQkJZGlyMF9tc24gPSAwOwoJCQlwID0gQ3g0ODZfbmFtZVsoYy0+aGFyZF9tYXRoKSA/IDEgOiAwXTsKCQkJYnJlYWs7CgoJCWNhc2UgMHhlOiAgLyogYSA0ODZTIEEgc3RlcCAqLwoJCQlkaXIwX21zbiA9IDA7CgkJCXAgPSBDeDQ4NlNfbmFtZVswXTsKCQkJYnJlYWs7CgkJfQoJCWJyZWFrOwoKCWRlZmF1bHQ6ICAvKiB1bmtub3duIChzaG91bGRuJ3QgaGFwcGVuLCB3ZSBrbm93IGV2ZXJ5b25lIDstKSAqLwoJCWRpcjBfbXNuID0gNzsKCQlicmVhazsKCX0KCXN0cmNweShidWYsIEN4ODZfbW9kZWxbZGlyMF9tc24gJiA3XSk7CglpZiAocCkgc3RyY2F0KGJ1ZiwgcCk7CglyZXR1cm47Cn0KCi8qCiAqIEN5cml4IENQVXMgd2l0aG91dCBjcHVpZCBvciB3aXRoIGNwdWlkIG5vdCB5ZXQgZW5hYmxlZCBjYW4gYmUgZGV0ZWN0ZWQKICogYnkgdGhlIGZhY3QgdGhhdCB0aGV5IHByZXNlcnZlIHRoZSBmbGFncyBhY3Jvc3MgdGhlIGRpdmlzaW9uIG9mIDUvMi4KICogUElJIGFuZCBQUHJvIGV4aGliaXQgdGhpcyBiZWhhdmlvciB0b28sIGJ1dCB0aGV5IGhhdmUgY3B1aWQgYXZhaWxhYmxlLgogKi8KIAovKgogKiBQZXJmb3JtIHRoZSBDeXJpeCA1LzIgdGVzdC4gQSBDeXJpeCB3b24ndCBjaGFuZ2UKICogdGhlIGZsYWdzLCB3aGlsZSBvdGhlciA0ODYgY2hpcHMgd2lsbC4KICovCnN0YXRpYyBpbmxpbmUgaW50IHRlc3RfY3lyaXhfNTJkaXYodm9pZCkKewoJdW5zaWduZWQgaW50IHRlc3Q7CgoJX19hc21fXyBfX3ZvbGF0aWxlX18oCgkgICAgICJzYWhmXG5cdCIJCS8qIGNsZWFyIGZsYWdzICglZWF4ID0gMHgwMDA1KSAqLwoJICAgICAiZGl2ICViMlxuXHQiCS8qIGRpdmlkZSA1IGJ5IDIgKi8KCSAgICAgImxhaGYiCQkvKiBzdG9yZSBmbGFncyBpbnRvICVhaCAqLwoJICAgICA6ICI9YSIgKHRlc3QpCgkgICAgIDogIjAiICg1KSwgInEiICgyKQoJICAgICA6ICJjYyIpOwoKCS8qIEFIIGlzIDB4MDIgb24gQ3lyaXggYWZ0ZXIgdGhlIGRpdmlkZS4uICovCglyZXR1cm4gKHVuc2lnbmVkIGNoYXIpICh0ZXN0ID4+IDgpID09IDB4MDI7Cn0KCnN0YXRpYyB2b2lkIGN5cml4X2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCnsKCS8qIERldGVjdCBDeXJpeCB3aXRoIGRpc2FibGVkIENQVUlEICovCglpZiAoIGMtPng4NiA9PSA0ICYmIHRlc3RfY3lyaXhfNTJkaXYoKSApIHsKCQl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjE7CgkJCgkJc3RyY3B5KGMtPng4Nl92ZW5kb3JfaWQsICJDeXJpeEluc3RlYWQiKTsKCSAgICAgICAgYy0+eDg2X3ZlbmRvciA9IFg4Nl9WRU5ET1JfQ1lSSVg7CgkgICAgICAgIAoJICAgICAgICAvKiBBY3R1YWxseSBlbmFibGUgY3B1aWQgb24gdGhlIG9sZGVyIGN5cml4ICovCgkgICAgCgkgICAgCS8qIFJldHJpZXZlIENQVSByZXZpc2lvbnMgKi8KCSAgICAJCgkJZG9fY3lyaXhfZGV2aWQoJmRpcjAsICZkaXIxKTsKCgkJZGlyMD4+PTQ7CQkKCQkKCQkvKiBDaGVjayBpdCBpcyBhbiBhZmZlY3RlZCBtb2RlbCAqLwoJCQogICAJICAgICAgICBpZiAoZGlyMCA9PSA1IHx8IGRpcjAgPT0gMykKICAgCSAgICAgICAgewoJCQl1bnNpZ25lZCBjaGFyIGNjcjMsIGNjcjQ7CgkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgkJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIENQVUlEIG9uIEN5cml4IHByb2Nlc3Nvci5cbiIpOwoJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CgkJCWNjcjMgPSBnZXRDeDg2KENYODZfQ0NSMyk7CgkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCAoY2NyMyAmIDB4MGYpIHwgMHgxMCk7IC8qIGVuYWJsZSBNQVBFTiAgKi8KCQkJY2NyNCA9IGdldEN4ODYoQ1g4Nl9DQ1I0KTsKCQkJc2V0Q3g4NihDWDg2X0NDUjQsIGNjcjQgfCAweDgwKTsgICAgICAgICAgLyogZW5hYmxlIGNwdWlkICAqLwoJCQlzZXRDeDg2KENYODZfQ0NSMywgY2NyMyk7ICAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIE1BUEVOICovCgkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKCQl9Cgl9CglnZW5lcmljX2lkZW50aWZ5KGMpOwp9CgpzdGF0aWMgc3RydWN0IGNwdV9kZXYgY3lyaXhfY3B1X2RldiBfX2luaXRkYXRhID0gewoJLmNfdmVuZG9yCT0gIkN5cml4IiwKCS5jX2lkZW50IAk9IHsgIkN5cml4SW5zdGVhZCIgfSwKCS5jX2luaXQJCT0gaW5pdF9jeXJpeCwKCS5jX2lkZW50aWZ5CT0gY3lyaXhfaWRlbnRpZnksCn07CgppbnQgX19pbml0IGN5cml4X2luaXRfY3B1KHZvaWQpCnsKCWNwdV9kZXZzW1g4Nl9WRU5ET1JfQ1lSSVhdID0gJmN5cml4X2NwdV9kZXY7CglyZXR1cm4gMDsKfQoKLy9lYXJseV9hcmNoX2luaXRjYWxsKGN5cml4X2luaXRfY3B1KTsKCnN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuc2NfY3B1X2RldiBfX2luaXRkYXRhID0gewoJLmNfdmVuZG9yCT0gIk5TQyIsCgkuY19pZGVudCAJPSB7ICJHZW9kZSBieSBOU0MiIH0sCgkuY19pbml0CQk9IGluaXRfY3lyaXgsCgkuY19pZGVudGlmeQk9IGdlbmVyaWNfaWRlbnRpZnksCn07CgppbnQgX19pbml0IG5zY19pbml0X2NwdSh2b2lkKQp7CgljcHVfZGV2c1tYODZfVkVORE9SX05TQ10gPSAmbnNjX2NwdV9kZXY7CglyZXR1cm4gMDsKfQoKLy9lYXJseV9hcmNoX2luaXRjYWxsKG5zY19pbml0X2NwdSk7Cg==