Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG1rc3dhcC5jIC0gc2V0IHVwIGEgbGludXggc3dhcCBkZXZpY2UKICoKICogKEMpIDE5OTEgTGludXMgVG9ydmFsZHMuIFRoaXMgZmlsZSBtYXkgYmUgcmVkaXN0cmlidXRlZCBhcyBwZXIKICogdGhlIExpbnV4IGNvcHlyaWdodC4KICovCgovKgogKiAyMC4xMi45MSAgLQl0aW1lIGJlZ2FuLiBHb3QgVk0gd29ya2luZyB5ZXN0ZXJkYXkgYnkgZG9pbmcgdGhpcyBieSBoYW5kLgogKgogKiBVc2FnZTogbWtzd2FwIFstY10gWy12Tl0gWy1mXSBkZXZpY2UgW3NpemUtaW4tYmxvY2tzXQogKgogKgktYyAgIGZvciByZWFkYWJpbGl0eSBjaGVja2luZy4gKFVzZSBpdCB1bmxlc3MgeW91IGFyZSBTVVJFISkKICoJLXZOICBmb3Igc3dhcCBhcmVhcyB2ZXJzaW9uIE4uIChPbmx5IE49MCwxIGtub3duIHRvZGF5LikKICogICAgICAtZiAgIGZvciBmb3JjaW5nIHN3YXAgY3JlYXRpb24gZXZlbiBpZiBpdCB3b3VsZCBzbWFzaCBwYXJ0aXRpb24gdGFibGUuCiAqCiAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGFuIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgogKgogKiBQYXRjaGVzIGZyb20gamFnZ3lAcHVycGxldC5kZW1vbi5jby51ayAoTWlrZSBKYWdkaXMpIHRvIG1ha2UgdGhlCiAqIHNpemUtaW4tYmxvY2tzIHBhcmFtZXRlciBvcHRpb25hbCBhZGRlZCBXZWQgRmViICA4IDEwOjMzOjQzIDE5OTUuCiAqCiAqIFZlcnNpb24gMSBzd2FwIGFyZWEgY29kZSAoZm9yIGtlcm5lbCAyLjEuMTE3KSwgYWViLCA5ODEwMTAuCiAqCiAqIFNwYXJjIGZpeGVzLCBqakB1bHRyYS5saW51eC5jeiAoSmFrdWIgSmVsaW5layksIDk4MTIwMSAtIG1hbmdsZWQgYnkgYWViLgogKiBWMV9NQVhfUEFHRVMgZml4ZXMsIGpqLCA5OTAzMjUuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqICBmcm9tIHV0aWwtbGludXggLS0gYWRhcHRlZCBmb3IgYnVzeWJveCBieQogKiAgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4uIEkgcmlwcGVkIG91dCBOYXRpdmUgTGFuZ3VhZ2UKICogIFN1cHBvcnQsIG1hZGUgc29tZSBzdHVmZiBzbWFsbGVyLCBhbmQgZml0dGVkIGZvciBsaWZlIGluIGJ1c3lib3guCiAqCiAqLwoKI2luY2x1ZGUgImludGVybmFsLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgkJCS8qIGZvciBfSU8gKi8KI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4JCQkvKiBmb3IgUEFHRV9TSVpFIGFuZCBQQUdFX1NISUZUICovCgkJCQkvKiB3ZSBhbHNvIGdldCBQQUdFX1NJWkUgdmlhIGdldHBhZ2VzaXplKCkgKi8KCiNpZm5kZWYgX0lPCi8qIHByZS0xLjMuNDUgKi8KI2RlZmluZSBCTEtHRVRTSVpFIDB4MTI2MAojZWxzZQovKiBzYW1lIG9uIGkzODYsIG02OGssIGFybTsgZGlmZmVyZW50IG9uIGFscGhhLCBtaXBzLCBzcGFyYywgcHBjICovCiNkZWZpbmUgQkxLR0VUU0laRSBfSU8oMHgxMiw5NikKI2VuZGlmCgpzdGF0aWMgY2hhciAqZGV2aWNlX25hbWUgPSBOVUxMOwpzdGF0aWMgaW50IERFViA9IC0xOwpzdGF0aWMgbG9uZyBQQUdFUyA9IDA7CnN0YXRpYyBpbnQgY2hlY2sgPSAwOwpzdGF0aWMgaW50IGJhZHBhZ2VzID0gMDsKc3RhdGljIGludCB2ZXJzaW9uID0gLTE7CgojZGVmaW5lIE1BS0VfVkVSU0lPTihwLHEscikJKDY1NTM2KihwKSArIDI1NioocSkgKyAocikpCgpzdGF0aWMgaW50IGxpbnV4X3ZlcnNpb25fY29kZSh2b2lkKQp7CglzdHJ1Y3QgdXRzbmFtZSBteV91dHNuYW1lOwoJaW50IHAsIHEsIHI7CgoJaWYgKHVuYW1lKCZteV91dHNuYW1lKSA9PSAwKSB7CgkJcCA9IGF0b2koc3RydG9rKG15X3V0c25hbWUucmVsZWFzZSwgIi4iKSk7CgkJcSA9IGF0b2koc3RydG9rKE5VTEwsICIuIikpOwoJCXIgPSBhdG9pKHN0cnRvayhOVUxMLCAiLiIpKTsKCQlyZXR1cm4gTUFLRV9WRVJTSU9OKHAsIHEsIHIpOwoJfQoJcmV0dXJuIDA7Cn0KCi8qCiAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSB1bmlvbiBzd2FwX2hlYWRlciB1c2VzIHRoZSBjb25zdGFudCBQQUdFX1NJWkUuCiAqIFVuZm9ydHVuYXRlbHksIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB0aGlzIGRlcGVuZHMgb24gdGhlIGhhcmR3YXJlIG1vZGVsLAogKiBhbmQgY2FuIG9ubHkgYmUgZm91bmQgYXQgcnVuIHRpbWUgLS0gd2UgdXNlIGdldHBhZ2VzaXplKCkuCiAqLwoKc3RhdGljIGludCBwYWdlc2l6ZTsKc3RhdGljIGludCAqc2lnbmF0dXJlX3BhZ2U7CgpzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjEgewoJY2hhciBib290Yml0c1sxMDI0XTsJCS8qIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLwoJdW5zaWduZWQgaW50IHZlcnNpb247Cgl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlOwoJdW5zaWduZWQgaW50IG5yX2JhZHBhZ2VzOwoJdW5zaWduZWQgaW50IHBhZGRpbmdbMTI1XTsKCXVuc2lnbmVkIGludCBiYWRwYWdlc1sxXTsKfSAqcDsKCnN0YXRpYyB2b2lkIGluaXRfc2lnbmF0dXJlX3BhZ2UoKQp7CglwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CgojaWZkZWYgUEFHRV9TSVpFCglpZiAocGFnZXNpemUgIT0gUEFHRV9TSVpFKQoJCWVycm9yTXNnKCJBc3N1bWluZyBwYWdlcyBvZiBzaXplICVkXG4iLCBwYWdlc2l6ZSk7CiNlbmRpZgoJc2lnbmF0dXJlX3BhZ2UgPSAoaW50ICopIHhtYWxsb2MocGFnZXNpemUpOwoJbWVtc2V0KHNpZ25hdHVyZV9wYWdlLCAwLCBwYWdlc2l6ZSk7CglwID0gKHN0cnVjdCBzd2FwX2hlYWRlcl92MSAqKSBzaWduYXR1cmVfcGFnZTsKfQoKc3RhdGljIHZvaWQgd3JpdGVfc2lnbmF0dXJlKGNoYXIgKnNpZykKewoJY2hhciAqc3AgPSAoY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCglzdHJuY3B5KHNwICsgcGFnZXNpemUgLSAxMCwgc2lnLCAxMCk7Cn0KCiNkZWZpbmUgVjBfTUFYX1BBR0VTCSg4ICogKHBhZ2VzaXplIC0gMTApKQovKiBCZWZvcmUgMi4yLjBwcmU5ICovCiNkZWZpbmUgVjFfT0xEX01BWF9QQUdFUwkoKDB4N2ZmZmZmZmYgLyBwYWdlc2l6ZSkgLSAxKQovKiBTaW5jZSAyLjIuMHByZTk6CiAgIGVycm9yIGlmIG5yIG9mIHBhZ2VzID49IFNXUF9PRkZTRVQoU1dQX0VOVFJZKDAsfjBVTCkpCiAgIHdpdGggdmFyaWF0aW9ucyBvbgoJI2RlZmluZSBTV1BfRU5UUlkodHlwZSxvZmZzZXQpICgoKHR5cGUpIDw8IDEpIHwgKChvZmZzZXQpIDw8IDgpKQoJI2RlZmluZSBTV1BfT0ZGU0VUKGVudHJ5KSAoKGVudHJ5KSA+PiA4KQogICBvbiB0aGUgdmFyaW91cyBhcmNoaXRlY3R1cmVzLiBCZWxvdyB0aGUgcmVzdWx0IC0geXVrLgoKICAgTWFjaGluZQlwYWdlc2l6ZQlTV1BfRU5UUlkJU1dQX09GRlNFVAlib3VuZCsxCW9sZGJvdW5kKzIKICAgaTM4NgkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgbWlwcwkJMl4xMgkJbzw8MTUJCWU+PjE1CQkxPDwxNwkxPDwxOQogICBhbHBoYQkyXjEzCQlvPDw0MAkJZT4+NDAJCTE8PDI0CTE8PDE4CiAgIG02OGsJCTJeMTIJCW88PDEyCQllPj4xMgkJMTw8MjAJMTw8MTkKICAgc3BhcmMJMl57MTIsMTN9CShvJjB4M2ZmZmYpPDw5CShlPj45KSYweDNmZmZmCTE8PDE4CTE8PHsxOSwxOH0KICAgc3BhcmM2NAkyXjEzCQlvPDwxMwkJZT4+MTMJCTE8PDUxCTE8PDE4CiAgIHBwYwkJMl4xMgkJbzw8OAkJZT4+OAkJMTw8MjQJMTw8MTkKICAgYXJtbwkJMl57MTMsMTQsMTV9CW88PDgJCWU+PjgJCTE8PDI0CTE8PHsxOCwxNywxNn0KICAgYXJtdgkJMl4xMgkJbzw8OQkJZT4+OQkJMTw8MjMJMTw8MTkKCiAgIGFzc3VtaW5nIHRoYXQgbG9uZ3MgaGF2ZSA2NCBiaXRzIG9uIGFscGhhIGFuZCBzcGFyYzY0IGFuZCAzMiBiaXRzIGVsc2V3aGVyZS4KCiAgIFRoZSBiYWQgcGFydCBpcyB0aGF0IHdlIG5lZWQgdG8ga25vdyB0aGlzIHNpbmNlIHRoZSBrZXJuZWwgd2lsbAogICByZWZ1c2UgYSBzd2FwIHNwYWNlIGlmIGl0IGlzIHRvbyBsYXJnZS4KKi8KLyogcGF0Y2ggZnJvbSBqaiAtIHdoeSBkb2VzIHRoaXMgZGlmZmVyIGZyb20gdGhlIGFib3ZlPyAqLwojaWYgZGVmaW5lZChfX2FscGhhX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMjQpIC0gMSkKI2VsaWYgZGVmaW5lZChfX21pcHNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMSA8PCAxNykgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfdjlfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgICgoMyA8PCAyOSkgLSAxKQojZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIChwYWdlc2l6ZSA9PSA4MTkyID8gKCgzIDw8IDI5KSAtIDEpIDogKCgxIDw8IDE4KSAtIDEpKQojZWxzZQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgVjFfT0xEX01BWF9QQUdFUwojZW5kaWYKLyogbWFuIHBhZ2Ugbm93IHNheXM6ClRoZSBtYXhpbXVtIHVzZWZ1bCBzaXplIG9mIGEgc3dhcCBhcmVhIG5vdyBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUuCkl0IGlzIHJvdWdobHkgMkdCIG9uIGkzODYsIFBQQywgbTY4aywgQVJNLCAxR0Igb24gc3BhcmMsIDUxMk1CIG9uIG1pcHMsCjEyOEdCIG9uIGFscGhhIGFuZCAzVEIgb24gc3BhcmM2NC4KKi8KCiNkZWZpbmUgTUFYX0JBRFBBR0VTCSgocGFnZXNpemUtMTAyNC0xMjgqc2l6ZW9mKGludCktMTApL3NpemVvZihpbnQpKQoKc3RhdGljIHZvaWQgYml0X3NldCh1bnNpZ25lZCBpbnQgKmFkZHIsIHVuc2lnbmVkIGludCBucikKewoJdW5zaWduZWQgaW50IHIsIG07CgoJYWRkciArPSBuciAvICg4ICogc2l6ZW9mKGludCkpOwoKCXIgPSAqYWRkcjsKCW0gPSAxIDw8IChuciAmICg4ICogc2l6ZW9mKGludCkgLSAxKSk7CgoJKmFkZHIgPSByIHwgbTsKfQoKc3RhdGljIGludCBiaXRfdGVzdF9hbmRfY2xlYXIodW5zaWduZWQgaW50ICphZGRyLCB1bnNpZ25lZCBpbnQgbnIpCnsKCXVuc2lnbmVkIGludCByLCBtOwoKCWFkZHIgKz0gbnIgLyAoOCAqIHNpemVvZihpbnQpKTsKCglyID0gKmFkZHI7CgltID0gMSA8PCAobnIgJiAoOCAqIHNpemVvZihpbnQpIC0gMSkpOwoKCSphZGRyID0gciAmIH5tOwoJcmV0dXJuIChyICYgbSkgIT0gMDsKfQoKCnZvaWQgZGllKGNvbnN0IGNoYXIgKnN0cikKewoJZXJyb3JNc2coIiVzXG4iLCBzdHIpOwoJZXhpdChGQUxTRSk7Cn0KCnZvaWQgcGFnZV9vayhpbnQgcGFnZSkKewoJaWYgKHZlcnNpb24gPT0gMCkKCQliaXRfc2V0KHNpZ25hdHVyZV9wYWdlLCBwYWdlKTsKfQoKdm9pZCBwYWdlX2JhZChpbnQgcGFnZSkKewoJaWYgKHZlcnNpb24gPT0gMCkKCQliaXRfdGVzdF9hbmRfY2xlYXIoc2lnbmF0dXJlX3BhZ2UsIHBhZ2UpOwoJZWxzZSB7CgkJaWYgKGJhZHBhZ2VzID09IE1BWF9CQURQQUdFUykKCQkJZGllKCJ0b28gbWFueSBiYWQgcGFnZXMiKTsKCQlwLT5iYWRwYWdlc1tiYWRwYWdlc10gPSBwYWdlOwoJfQoJYmFkcGFnZXMrKzsKfQoKdm9pZCBjaGVja19ibG9ja3Modm9pZCkKewoJdW5zaWduZWQgaW50IGN1cnJlbnRfcGFnZTsKCWludCBkb19zZWVrID0gMTsKCWNoYXIgKmJ1ZmZlcjsKCglidWZmZXIgPSB4bWFsbG9jKHBhZ2VzaXplKTsKCWN1cnJlbnRfcGFnZSA9IDA7Cgl3aGlsZSAoY3VycmVudF9wYWdlIDwgUEFHRVMpIHsKCQlpZiAoIWNoZWNrKSB7CgkJCXBhZ2Vfb2soY3VycmVudF9wYWdlKyspOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKGRvX3NlZWsgJiYgbHNlZWsoREVWLCBjdXJyZW50X3BhZ2UgKiBwYWdlc2l6ZSwgU0VFS19TRVQpICE9CgkJCWN1cnJlbnRfcGFnZSAqIHBhZ2VzaXplKQoJCQlkaWUoInNlZWsgZmFpbGVkIGluIGNoZWNrX2Jsb2NrcyIpOwoJCWlmICgoZG9fc2VlayA9IChwYWdlc2l6ZSAhPSByZWFkKERFViwgYnVmZmVyLCBwYWdlc2l6ZSkpKSkgewoJCQlwYWdlX2JhZChjdXJyZW50X3BhZ2UrKyk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwYWdlX29rKGN1cnJlbnRfcGFnZSsrKTsKCX0KCWlmIChiYWRwYWdlcyA9PSAxKQoJCXByaW50Zigib25lIGJhZCBwYWdlXG4iKTsKCWVsc2UgaWYgKGJhZHBhZ2VzID4gMSkKCQlwcmludGYoIiVkIGJhZCBwYWdlc1xuIiwgYmFkcGFnZXMpOwp9CgpzdGF0aWMgbG9uZyB2YWxpZF9vZmZzZXQoaW50IGZkLCBpbnQgb2Zmc2V0KQp7CgljaGFyIGNoOwoKCWlmIChsc2VlayhmZCwgb2Zmc2V0LCAwKSA8IDApCgkJcmV0dXJuIDA7CglpZiAocmVhZChmZCwgJmNoLCAxKSA8IDEpCgkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBmaW5kX3NpemUoaW50IGZkKQp7Cgl1bnNpZ25lZCBpbnQgaGlnaCwgbG93OwoKCWxvdyA9IDA7Cglmb3IgKGhpZ2ggPSAxOyBoaWdoID4gMCAmJiB2YWxpZF9vZmZzZXQoZmQsIGhpZ2gpOyBoaWdoICo9IDIpCgkJbG93ID0gaGlnaDsKCXdoaWxlIChsb3cgPCBoaWdoIC0gMSkgewoJCWNvbnN0IGludCBtaWQgPSAobG93ICsgaGlnaCkgLyAyOwoKCQlpZiAodmFsaWRfb2Zmc2V0KGZkLCBtaWQpKQoJCQlsb3cgPSBtaWQ7CgkJZWxzZQoJCQloaWdoID0gbWlkOwoJfQoJcmV0dXJuIChsb3cgKyAxKTsKfQoKLyogcmV0dXJuIHNpemUgaW4gcGFnZXMsIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8Kc3RhdGljIGxvbmcgZ2V0X3NpemUoY29uc3QgY2hhciAqZmlsZSkKewoJaW50IGZkOwoJbG9uZyBzaXplOwoKCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CglpZiAoZmQgPCAwKSB7CgkJcGVycm9yKGZpbGUpOwoJCWV4aXQoMSk7Cgl9CglpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkUsICZzaXplKSA+PSAwKSB7CgkJaW50IHNlY3RvcnNfcGVyX3BhZ2UgPSBwYWdlc2l6ZSAvIDUxMjsKCgkJc2l6ZSAvPSBzZWN0b3JzX3Blcl9wYWdlOwoJfSBlbHNlIHsKCQlzaXplID0gZmluZF9zaXplKGZkKSAvIHBhZ2VzaXplOwoJfQoJY2xvc2UoZmQpOwoJcmV0dXJuIHNpemU7Cn0KCmludCBta3N3YXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWNoYXIgKnRtcDsKCXN0cnVjdCBzdGF0IHN0YXRidWY7CglpbnQgc3o7CglpbnQgbWF4cGFnZXM7CglpbnQgZ29vZHBhZ2VzOwoJaW50IG9mZnNldDsKCWludCBmb3JjZSA9IDA7CgoJaW5pdF9zaWduYXR1cmVfcGFnZSgpOwkJLyogZ2V0IHBhZ2VzaXplICovCgoJd2hpbGUgKGFyZ2MtLSA+IDEpIHsKCQlhcmd2Kys7CgkJaWYgKGFyZ3ZbMF1bMF0gIT0gJy0nKSB7CgkJCWlmIChkZXZpY2VfbmFtZSkgewoJCQkJaW50IGJsb2Nrc19wZXJfcGFnZSA9IHBhZ2VzaXplIC8gMTAyNDsKCgkJCQlQQUdFUyA9IHN0cnRvbChhcmd2WzBdLCAmdG1wLCAwKSAvIGJsb2Nrc19wZXJfcGFnZTsKCQkJCWlmICgqdG1wKQoJCQkJCXVzYWdlKG1rc3dhcF91c2FnZSk7CgkJCX0gZWxzZQoJCQkJZGV2aWNlX25hbWUgPSBhcmd2WzBdOwoJCX0gZWxzZSB7CgkJCXN3aXRjaCAoYXJndlswXVsxXSkgewoJCQljYXNlICdjJzoKCQkJCWNoZWNrID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlICdmJzoKCQkJCWZvcmNlID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlICd2JzoKCQkJCXZlcnNpb24gPSBhdG9pKGFyZ3ZbMF0gKyAyKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJdXNhZ2UobWtzd2FwX3VzYWdlKTsKCQkJfQoJCX0KCX0KCWlmICghZGV2aWNlX25hbWUpIHsKCQllcnJvck1zZygiZXJyb3I6IE5vd2hlcmUgdG8gc2V0IHVwIHN3YXAgb24/XG4iKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQoJc3ogPSBnZXRfc2l6ZShkZXZpY2VfbmFtZSk7CglpZiAoIVBBR0VTKSB7CgkJUEFHRVMgPSBzejsKCX0gZWxzZSBpZiAoUEFHRVMgPiBzeiAmJiAhZm9yY2UpIHsKCQllcnJvck1zZygiZXJyb3I6IHNpemUgJWxkIGlzIGxhcmdlciB0aGFuIGRldmljZSBzaXplICVkXG4iLAoJCQkJUEFHRVMgKiAocGFnZXNpemUgLyAxMDI0KSwgc3ogKiAocGFnZXNpemUgLyAxMDI0KSk7CgkJZXhpdChGQUxTRSk7Cgl9CgoJaWYgKHZlcnNpb24gPT0gLTEpIHsKCQlpZiAoUEFHRVMgPD0gVjBfTUFYX1BBR0VTKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlIGlmIChsaW51eF92ZXJzaW9uX2NvZGUoKSA8IE1BS0VfVkVSU0lPTigyLCAxLCAxMTcpKQoJCQl2ZXJzaW9uID0gMDsKCQllbHNlIGlmIChwYWdlc2l6ZSA8IDIwNDgpCgkJCXZlcnNpb24gPSAwOwoJCWVsc2UKCQkJdmVyc2lvbiA9IDE7Cgl9CglpZiAodmVyc2lvbiAhPSAwICYmIHZlcnNpb24gIT0gMSkgewoJCWVycm9yTXNnKCJlcnJvcjogdW5rbm93biB2ZXJzaW9uICVkXG4iLCB2ZXJzaW9uKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQoJaWYgKFBBR0VTIDwgMTApIHsKCQllcnJvck1zZygiZXJyb3I6IHN3YXAgYXJlYSBuZWVkcyB0byBiZSBhdCBsZWFzdCAlbGRrQlxuIiwKCQkJCShsb25nKSAoMTAgKiBwYWdlc2l6ZSAvIDEwMjQpKTsKCQl1c2FnZShta3N3YXBfdXNhZ2UpOwoJfQojaWYgMAoJbWF4cGFnZXMgPSAoKHZlcnNpb24gPT0gMCkgPyBWMF9NQVhfUEFHRVMgOiBWMV9NQVhfUEFHRVMpOwojZWxzZQoJaWYgKCF2ZXJzaW9uKQoJCW1heHBhZ2VzID0gVjBfTUFYX1BBR0VTOwoJZWxzZSBpZiAobGludXhfdmVyc2lvbl9jb2RlKCkgPj0gTUFLRV9WRVJTSU9OKDIsIDIsIDEpKQoJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJZWxzZSB7CgkJbWF4cGFnZXMgPSBWMV9PTERfTUFYX1BBR0VTOwoJCWlmIChtYXhwYWdlcyA+IFYxX01BWF9QQUdFUykKCQkJbWF4cGFnZXMgPSBWMV9NQVhfUEFHRVM7Cgl9CiNlbmRpZgoJaWYgKFBBR0VTID4gbWF4cGFnZXMpIHsKCQlQQUdFUyA9IG1heHBhZ2VzOwoJCWVycm9yTXNnKCJ3YXJuaW5nOiB0cnVuY2F0aW5nIHN3YXAgYXJlYSB0byAlbGRrQlxuIiwKCQkJCVBBR0VTICogcGFnZXNpemUgLyAxMDI0KTsKCX0KCglERVYgPSBvcGVuKGRldmljZV9uYW1lLCBPX1JEV1IpOwoJaWYgKERFViA8IDAgfHwgZnN0YXQoREVWLCAmc3RhdGJ1ZikgPCAwKSB7CgkJcGVycm9yKGRldmljZV9uYW1lKTsKCQlleGl0KEZBTFNFKTsKCX0KCWlmICghU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpKQoJCWNoZWNrID0gMDsKCWVsc2UgaWYgKHN0YXRidWYuc3RfcmRldiA9PSAweDAzMDAgfHwgc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDM0MCkKCQlkaWUoIldpbGwgbm90IHRyeSB0byBtYWtlIHN3YXBkZXZpY2Ugb24gJyVzJyIpOwoKI2lmZGVmIF9fc3BhcmNfXwoJaWYgKCFmb3JjZSAmJiB2ZXJzaW9uID09IDApIHsKCQkvKiBEb24ndCBvdmVyd3JpdGUgcGFydGl0aW9uIHRhYmxlIHVubGVzcyBmb3JjZWQgKi8KCQl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBzaWduYXR1cmVfcGFnZTsKCQl1bnNpZ25lZCBzaG9ydCAqcSwgc3VtOwoKCQlpZiAocmVhZChERVYsIGJ1ZmZlciwgNTEyKSAhPSA1MTIpCgkJCWRpZSgiZmF0YWw6IGZpcnN0IHBhZ2UgdW5yZWFkYWJsZSIpOwoJCWlmIChidWZmZXJbNTA4XSA9PSAweERBICYmIGJ1ZmZlcls1MDldID09IDB4QkUpIHsKCQkJcSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoYnVmZmVyICsgNTEwKTsKCQkJZm9yIChzdW0gPSAwOyBxID49ICh1bnNpZ25lZCBzaG9ydCAqKSBidWZmZXI7KQoJCQkJc3VtIF49ICpxLS07CgkJCWlmICghc3VtKSB7CgkJCQllcnJvck1zZygiRGV2aWNlICclcycgY29udGFpbnMgYSB2YWxpZCBTdW4gZGlza2xhYmVsLlxuIgoiVGhpcyBwcm9iYWJseSBtZWFucyBjcmVhdGluZyB2MCBzd2FwIHdvdWxkIGRlc3Ryb3kgeW91ciBwYXJ0aXRpb24gdGFibGVcbiIKIk5vIHN3YXAgY3JlYXRlZC4gSWYgeW91IHJlYWxseSB3YW50IHRvIGNyZWF0ZSBzd2FwIHYwIG9uIHRoYXQgZGV2aWNlLCB1c2VcbiIKInRoZSAtZiBvcHRpb24gdG8gZm9yY2UgaXQuXG4iLCBkZXZpY2VfbmFtZSk7CgkJCQlleGl0KEZBTFNFKTsKCQkJfQoJCX0KCX0KI2VuZGlmCgoJaWYgKHZlcnNpb24gPT0gMCB8fCBjaGVjaykKCQljaGVja19ibG9ja3MoKTsKCWlmICh2ZXJzaW9uID09IDAgJiYgIWJpdF90ZXN0X2FuZF9jbGVhcihzaWduYXR1cmVfcGFnZSwgMCkpCgkJZGllKCJmYXRhbDogZmlyc3QgcGFnZSB1bnJlYWRhYmxlIik7CglpZiAodmVyc2lvbiA9PSAxKSB7CgkJcC0+dmVyc2lvbiA9IHZlcnNpb247CgkJcC0+bGFzdF9wYWdlID0gUEFHRVMgLSAxOwoJCXAtPm5yX2JhZHBhZ2VzID0gYmFkcGFnZXM7Cgl9CgoJZ29vZHBhZ2VzID0gUEFHRVMgLSBiYWRwYWdlcyAtIDE7CglpZiAoZ29vZHBhZ2VzIDw9IDApCgkJZGllKCJVbmFibGUgdG8gc2V0IHVwIHN3YXAtc3BhY2U6IHVucmVhZGFibGUiKTsKCXByaW50ZigiU2V0dGluZyB1cCBzd2Fwc3BhY2UgdmVyc2lvbiAlZCwgc2l6ZSA9ICVsZCBieXRlc1xuIiwKCQkgICB2ZXJzaW9uLCAobG9uZykgKGdvb2RwYWdlcyAqIHBhZ2VzaXplKSk7Cgl3cml0ZV9zaWduYXR1cmUoKHZlcnNpb24gPT0gMCkgPyAiU1dBUC1TUEFDRSIgOiAiU1dBUFNQQUNFMiIpOwoKCW9mZnNldCA9ICgodmVyc2lvbiA9PSAwKSA/IDAgOiAxMDI0KTsKCWlmIChsc2VlayhERVYsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkKCQlkaWUoInVuYWJsZSB0byByZXdpbmQgc3dhcC1kZXZpY2UiKTsKCWlmICh3cml0ZShERVYsIChjaGFyICopIHNpZ25hdHVyZV9wYWdlICsgb2Zmc2V0LCBwYWdlc2l6ZSAtIG9mZnNldCkKCQkhPSBwYWdlc2l6ZSAtIG9mZnNldCkKCQlkaWUoInVuYWJsZSB0byB3cml0ZSBzaWduYXR1cmUgcGFnZSIpOwoKCS8qCgkgKiBBIHN1YnNlcXVlbnQgc3dhcG9uKCkgd2lsbCBmYWlsIGlmIHRoZSBzaWduYXR1cmUKCSAqIGlzIG5vdCBhY3R1YWxseSBvbiBkaXNrLiAoVGhpcyBpcyBhIGtlcm5lbCBidWcuKQoJICovCglpZiAoZnN5bmMoREVWKSkKCQlkaWUoImZzeW5jIGZhaWxlZCIpOwoJcmV0dXJuKFRSVUUpOwp9Cg==