LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgogKgogKi8KI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgImRybS5oIgojaW5jbHVkZSAiaTkxNV9kcm0uaCIKI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiNpbmNsdWRlICJpbnRlbF9iaW9zLmgiCgojZGVmaW5lCVNMQVZFX0FERFIxCTB4NzAKI2RlZmluZQlTTEFWRV9BRERSMgkweDcyCgpzdGF0aWMgaW50IHBhbmVsX3R5cGU7CgpzdGF0aWMgdm9pZCAqCmZpbmRfc2VjdGlvbihzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiLCBpbnQgc2VjdGlvbl9pZCkKewoJdTggKmJhc2UgPSAodTggKiliZGI7CglpbnQgaW5kZXggPSAwOwoJdTE2IHRvdGFsLCBjdXJyZW50X3NpemU7Cgl1OCBjdXJyZW50X2lkOwoKCS8qIHNraXAgdG8gZmlyc3Qgc2VjdGlvbiAqLwoJaW5kZXggKz0gYmRiLT5oZWFkZXJfc2l6ZTsKCXRvdGFsID0gYmRiLT5iZGJfc2l6ZTsKCgkvKiB3YWxrIHRoZSBzZWN0aW9ucyBsb29raW5nIGZvciBzZWN0aW9uX2lkICovCgl3aGlsZSAoaW5kZXggPCB0b3RhbCkgewoJCWN1cnJlbnRfaWQgPSAqKGJhc2UgKyBpbmRleCk7CgkJaW5kZXgrKzsKCQljdXJyZW50X3NpemUgPSAqKCh1MTYgKikoYmFzZSArIGluZGV4KSk7CgkJaW5kZXggKz0gMjsKCQlpZiAoY3VycmVudF9pZCA9PSBzZWN0aW9uX2lkKQoJCQlyZXR1cm4gYmFzZSArIGluZGV4OwoJCWluZGV4ICs9IGN1cnJlbnRfc2l6ZTsKCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHUxNgpnZXRfYmxvY2tzaXplKHZvaWQgKnApCnsKCXUxNiAqYmxvY2tfcHRyLCBibG9ja19zaXplOwoKCWJsb2NrX3B0ciA9ICh1MTYgKikoKGNoYXIgKilwIC0gMik7CglibG9ja19zaXplID0gKmJsb2NrX3B0cjsKCXJldHVybiBibG9ja19zaXplOwp9CgpzdGF0aWMgdm9pZApmaWxsX2RldGFpbF90aW1pbmdfZGF0YShzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZSwKCQkJc3RydWN0IGx2ZHNfZHZvX3RpbWluZyAqZHZvX3RpbWluZykKewoJcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgPSAoZHZvX3RpbWluZy0+aGFjdGl2ZV9oaSA8PCA4KSB8CgkJZHZvX3RpbWluZy0+aGFjdGl2ZV9sbzsKCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+aGRpc3BsYXkgKwoJCSgoZHZvX3RpbWluZy0+aHN5bmNfb2ZmX2hpIDw8IDgpIHwgZHZvX3RpbWluZy0+aHN5bmNfb2ZmX2xvKTsKCXBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0ICsKCQlkdm9fdGltaW5nLT5oc3luY19wdWxzZV93aWR0aDsKCXBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPmhibGFua19oaSA8PCA4KSB8IGR2b190aW1pbmctPmhibGFua19sbyk7CgoJcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgPSAoZHZvX3RpbWluZy0+dmFjdGl2ZV9oaSA8PCA4KSB8CgkJZHZvX3RpbWluZy0+dmFjdGl2ZV9sbzsKCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ID0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgKwoJCWR2b190aW1pbmctPnZzeW5jX29mZjsKCXBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX2VuZCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICsKCQlkdm9fdGltaW5nLT52c3luY19wdWxzZV93aWR0aDsKCXBhbmVsX2ZpeGVkX21vZGUtPnZ0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPnZkaXNwbGF5ICsKCQkoKGR2b190aW1pbmctPnZibGFua19oaSA8PCA4KSB8IGR2b190aW1pbmctPnZibGFua19sbyk7CglwYW5lbF9maXhlZF9tb2RlLT5jbG9jayA9IGR2b190aW1pbmctPmNsb2NrICogMTA7CglwYW5lbF9maXhlZF9tb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CgoJaWYgKGR2b190aW1pbmctPmhzeW5jX3Bvc2l0aXZlKQoJCXBhbmVsX2ZpeGVkX21vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfUEhTWU5DOwoJZWxzZQoJCXBhbmVsX2ZpeGVkX21vZGUtPmZsYWdzIHw9IERSTV9NT0RFX0ZMQUdfTkhTWU5DOwoKCWlmIChkdm9fdGltaW5nLT52c3luY19wb3NpdGl2ZSkKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX1BWU1lOQzsKCWVsc2UKCQlwYW5lbF9maXhlZF9tb2RlLT5mbGFncyB8PSBEUk1fTU9ERV9GTEFHX05WU1lOQzsKCgkvKiBTb21lIFZCVHMgaGF2ZSBib2d1cyBoL3Z0b3RhbCB2YWx1ZXMgKi8KCWlmIChwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQgPiBwYW5lbF9maXhlZF9tb2RlLT5odG90YWwpCgkJcGFuZWxfZml4ZWRfbW9kZS0+aHRvdGFsID0gcGFuZWxfZml4ZWRfbW9kZS0+aHN5bmNfZW5kICsgMTsKCWlmIChwYW5lbF9maXhlZF9tb2RlLT52c3luY19lbmQgPiBwYW5lbF9maXhlZF9tb2RlLT52dG90YWwpCgkJcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsID0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kICsgMTsKCglkcm1fbW9kZV9zZXRfbmFtZShwYW5lbF9maXhlZF9tb2RlKTsKfQoKLyogVHJ5IHRvIGZpbmQgaW50ZWdyYXRlZCBwYW5lbCBkYXRhICovCnN0YXRpYyB2b2lkCnBhcnNlX2xmcF9wYW5lbF9kYXRhKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkJICAgIHN0cnVjdCBiZGJfaGVhZGVyICpiZGIpCnsKCXN0cnVjdCBiZGJfbHZkc19vcHRpb25zICpsdmRzX29wdGlvbnM7CglzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGEgKmx2ZHNfbGZwX2RhdGE7CglzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfcHRycyAqbHZkc19sZnBfZGF0YV9wdHJzOwoJc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICplbnRyeTsKCXN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmc7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKCWludCBsZnBfZGF0YV9zaXplLCBkdm9fdGltaW5nX29mZnNldDsKCWludCBpLCB0ZW1wX2Rvd25jbG9jazsKCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICp0ZW1wX21vZGU7CgoJLyogRGVmYXVsdHMgaWYgd2UgY2FuJ3QgZmluZCBWQlQgaW5mbyAqLwoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gMDsKCWRldl9wcml2LT5sdmRzX3ZidCA9IDA7CgoJbHZkc19vcHRpb25zID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfT1BUSU9OUyk7CglpZiAoIWx2ZHNfb3B0aW9ucykKCQlyZXR1cm47CgoJZGV2X3ByaXYtPmx2ZHNfZGl0aGVyID0gbHZkc19vcHRpb25zLT5waXhlbF9kaXRoZXI7CglpZiAobHZkc19vcHRpb25zLT5wYW5lbF90eXBlID09IDB4ZmYpCgkJcmV0dXJuOwoJcGFuZWxfdHlwZSA9IGx2ZHNfb3B0aW9ucy0+cGFuZWxfdHlwZTsKCglsdmRzX2xmcF9kYXRhID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX0xWRFNfTEZQX0RBVEEpOwoJaWYgKCFsdmRzX2xmcF9kYXRhKQoJCXJldHVybjsKCglsdmRzX2xmcF9kYXRhX3B0cnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfTFZEU19MRlBfREFUQV9QVFJTKTsKCWlmICghbHZkc19sZnBfZGF0YV9wdHJzKQoJCXJldHVybjsKCglkZXZfcHJpdi0+bHZkc192YnQgPSAxOwoKCWxmcF9kYXRhX3NpemUgPSBsdmRzX2xmcF9kYXRhX3B0cnMtPnB0clsxXS5kdm9fdGltaW5nX29mZnNldCAtCgkJbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMF0uZHZvX3RpbWluZ19vZmZzZXQ7CgllbnRyeSA9IChzdHJ1Y3QgYmRiX2x2ZHNfbGZwX2RhdGFfZW50cnkgKikKCQkoKHVpbnQ4X3QgKilsdmRzX2xmcF9kYXRhLT5kYXRhICsgKGxmcF9kYXRhX3NpemUgKgoJCQkJCQkgICBsdmRzX29wdGlvbnMtPnBhbmVsX3R5cGUpKTsKCWR2b190aW1pbmdfb2Zmc2V0ID0gbHZkc19sZnBfZGF0YV9wdHJzLT5wdHJbMF0uZHZvX3RpbWluZ19vZmZzZXQgLQoJCWx2ZHNfbGZwX2RhdGFfcHRycy0+cHRyWzBdLmZwX3RpbWluZ19vZmZzZXQ7CgoJLyoKCSAqIHRoZSBzaXplIG9mIGZwX3RpbWluZyB2YXJpZXMgb24gdGhlIGRpZmZlcmVudCBwbGF0Zm9ybS4KCSAqIFNvIGNhbGN1bGF0ZSB0aGUgRFZPIHRpbWluZyByZWxhdGl2ZSBvZmZzZXQgaW4gTFZEUyBkYXRhCgkgKiBlbnRyeSB0byBnZXQgdGhlIERWTyB0aW1pbmcgZW50cnkKCSAqLwoJZHZvX3RpbWluZyA9IChzdHJ1Y3QgbHZkc19kdm9fdGltaW5nICopCgkJCSgodW5zaWduZWQgY2hhciAqKWVudHJ5ICsgZHZvX3RpbWluZ19vZmZzZXQpOwoKCXBhbmVsX2ZpeGVkX21vZGUgPSBremFsbG9jKHNpemVvZigqcGFuZWxfZml4ZWRfbW9kZSksIEdGUF9LRVJORUwpOwoJaWYgKCFwYW5lbF9maXhlZF9tb2RlKQoJCXJldHVybjsKCglmaWxsX2RldGFpbF90aW1pbmdfZGF0YShwYW5lbF9maXhlZF9tb2RlLCBkdm9fdGltaW5nKTsKCglkZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUgPSBwYW5lbF9maXhlZF9tb2RlOwoKCURSTV9ERUJVR19LTVMoIkZvdW5kIHBhbmVsIG1vZGUgaW4gQklPUyBWQlQgdGFibGVzOlxuIik7Cglkcm1fbW9kZV9kZWJ1Z19wcmludG1vZGVsaW5lKHBhbmVsX2ZpeGVkX21vZGUpOwoKCXRlbXBfbW9kZSA9IGt6YWxsb2Moc2l6ZW9mKCp0ZW1wX21vZGUpLCBHRlBfS0VSTkVMKTsKCXRlbXBfZG93bmNsb2NrID0gcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CgkvKgoJICogZW51bWVyYXRlIHRoZSBMVkRTIHBhbmVsIHRpbWluZyBpbmZvIGVudHJ5IGluIFZCVCB0byBjaGVjayB3aGV0aGVyCgkgKiB0aGUgTFZEUyBkb3duY2xvY2sgaXMgZm91bmQuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CgkJZW50cnkgPSAoc3RydWN0IGJkYl9sdmRzX2xmcF9kYXRhX2VudHJ5ICopCgkJCSgodWludDhfdCAqKWx2ZHNfbGZwX2RhdGEtPmRhdGEgKyAobGZwX2RhdGFfc2l6ZSAqIGkpKTsKCQlkdm9fdGltaW5nID0gKHN0cnVjdCBsdmRzX2R2b190aW1pbmcgKikKCQkJKCh1bnNpZ25lZCBjaGFyICopZW50cnkgKyBkdm9fdGltaW5nX29mZnNldCk7CgoJCWZpbGxfZGV0YWlsX3RpbWluZ19kYXRhKHRlbXBfbW9kZSwgZHZvX3RpbWluZyk7CgoJCWlmICh0ZW1wX21vZGUtPmhkaXNwbGF5ID09IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5ICYmCgkJdGVtcF9tb2RlLT5oc3luY19zdGFydCA9PSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19zdGFydCAmJgoJCXRlbXBfbW9kZS0+aHN5bmNfZW5kID09IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX2VuZCAmJgoJCXRlbXBfbW9kZS0+aHRvdGFsID09IHBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbCAmJgoJCXRlbXBfbW9kZS0+dmRpc3BsYXkgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dmRpc3BsYXkgJiYKCQl0ZW1wX21vZGUtPnZzeW5jX3N0YXJ0ID09IHBhbmVsX2ZpeGVkX21vZGUtPnZzeW5jX3N0YXJ0ICYmCgkJdGVtcF9tb2RlLT52c3luY19lbmQgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kICYmCgkJdGVtcF9tb2RlLT52dG90YWwgPT0gcGFuZWxfZml4ZWRfbW9kZS0+dnRvdGFsICYmCgkJdGVtcF9tb2RlLT5jbG9jayA8IHRlbXBfZG93bmNsb2NrKSB7CgkJCS8qCgkJCSAqIGRvd25jbG9jayBpcyBhbHJlYWR5IGZvdW5kLiBCdXQgd2UgZXhwZWN0CgkJCSAqIHRvIGZpbmQgdGhlIGxvd2VyIGRvd25jbG9jay4KCQkJICovCgkJCXRlbXBfZG93bmNsb2NrID0gdGVtcF9tb2RlLT5jbG9jazsKCQl9CgkJLyogY2xlYXIgaXQgdG8gemVybyAqLwoJCW1lbXNldCh0ZW1wX21vZGUsIDAsIHNpemVvZigqdGVtcF9tb2RlKSk7Cgl9CglrZnJlZSh0ZW1wX21vZGUpOwoJaWYgKHRlbXBfZG93bmNsb2NrIDwgcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2sgJiYKCSAgICBpOTE1X2x2ZHNfZG93bmNsb2NrKSB7CgkJZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrX2F2YWlsID0gMTsKCQlkZXZfcHJpdi0+bHZkc19kb3duY2xvY2sgPSB0ZW1wX2Rvd25jbG9jazsKCQlEUk1fREVCVUdfS01TKCJMVkRTIGRvd25jbG9jayBpcyBmb3VuZCBpbiBWQlQuICIsCgkJCQkiTm9ybWFsIENsb2NrICVkS0h6LCBkb3duY2xvY2sgJWRLSHpcbiIsCgkJCQl0ZW1wX2Rvd25jbG9jaywgcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2spOwoJfQoJcmV0dXJuOwp9CgovKiBUcnkgdG8gZmluZCBzZHZvIHBhbmVsIGRhdGEgKi8Kc3RhdGljIHZvaWQKcGFyc2Vfc2R2b19wYW5lbF9kYXRhKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX3Nkdm9fbHZkc19vcHRpb25zICpzZHZvX2x2ZHNfb3B0aW9uczsKCXN0cnVjdCBsdmRzX2R2b190aW1pbmcgKmR2b190aW1pbmc7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqcGFuZWxfZml4ZWRfbW9kZTsKCglkZXZfcHJpdi0+c2R2b19sdmRzX3ZidF9tb2RlID0gTlVMTDsKCglzZHZvX2x2ZHNfb3B0aW9ucyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9TRFZPX0xWRFNfT1BUSU9OUyk7CglpZiAoIXNkdm9fbHZkc19vcHRpb25zKQoJCXJldHVybjsKCglkdm9fdGltaW5nID0gZmluZF9zZWN0aW9uKGJkYiwgQkRCX1NEVk9fUEFORUxfRFREUyk7CglpZiAoIWR2b190aW1pbmcpCgkJcmV0dXJuOwoKCXBhbmVsX2ZpeGVkX21vZGUgPSBremFsbG9jKHNpemVvZigqcGFuZWxfZml4ZWRfbW9kZSksIEdGUF9LRVJORUwpOwoKCWlmICghcGFuZWxfZml4ZWRfbW9kZSkKCQlyZXR1cm47CgoJZmlsbF9kZXRhaWxfdGltaW5nX2RhdGEocGFuZWxfZml4ZWRfbW9kZSwKCQkJZHZvX3RpbWluZyArIHNkdm9fbHZkc19vcHRpb25zLT5wYW5lbF90eXBlKTsKCglkZXZfcHJpdi0+c2R2b19sdmRzX3ZidF9tb2RlID0gcGFuZWxfZml4ZWRfbW9kZTsKCglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkCnBhcnNlX2dlbmVyYWxfZmVhdHVyZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZGV2X3ByaXYtPmRldjsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9mZWF0dXJlcyAqZ2VuZXJhbDsKCgkvKiBTZXQgc2Vuc2libGUgZGVmYXVsdHMgaW4gY2FzZSB3ZSBjYW4ndCBmaW5kIHRoZSBnZW5lcmFsIGJsb2NrICovCglkZXZfcHJpdi0+aW50X3R2X3N1cHBvcnQgPSAxOwoJZGV2X3ByaXYtPmludF9jcnRfc3VwcG9ydCA9IDE7CgoJZ2VuZXJhbCA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0ZFQVRVUkVTKTsKCWlmIChnZW5lcmFsKSB7CgkJZGV2X3ByaXYtPmludF90dl9zdXBwb3J0ID0gZ2VuZXJhbC0+aW50X3R2X3N1cHBvcnQ7CgkJZGV2X3ByaXYtPmludF9jcnRfc3VwcG9ydCA9IGdlbmVyYWwtPmludF9jcnRfc3VwcG9ydDsKCQlkZXZfcHJpdi0+bHZkc191c2Vfc3NjID0gZ2VuZXJhbC0+ZW5hYmxlX3NzYzsKCgkJaWYgKGRldl9wcml2LT5sdmRzX3VzZV9zc2MpIHsKCQkJaWYgKElTX0k4NVgoZGV2X3ByaXYtPmRldikpCgkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CgkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyA2NiA6IDQ4OwoJCQllbHNlIGlmIChJU19JUk9OTEFLRShkZXZfcHJpdi0+ZGV2KSB8fCBJU19HRU42KGRldikpCgkJCQlkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9CgkJCQkJZ2VuZXJhbC0+c3NjX2ZyZXEgPyAxMDAgOiAxMjA7CgkJCWVsc2UKCQkJCWRldl9wcml2LT5sdmRzX3NzY19mcmVxID0KCQkJCQlnZW5lcmFsLT5zc2NfZnJlcSA/IDEwMCA6IDk2OwoJCX0KCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfZ2VuZXJhbF9kZWZpbml0aW9ucyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJCSAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGJkYl9nZW5lcmFsX2RlZmluaXRpb25zICpnZW5lcmFsOwoKCWdlbmVyYWwgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoZ2VuZXJhbCkgewoJCXUxNiBibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShnZW5lcmFsKTsKCQlpZiAoYmxvY2tfc2l6ZSA+PSBzaXplb2YoKmdlbmVyYWwpKSB7CgkJCWludCBidXNfcGluID0gZ2VuZXJhbC0+Y3J0X2RkY19nbWJ1c19waW47CgkJCURSTV9ERUJVR19LTVMoImNydF9kZGNfYnVzX3BpbjogJWRcbiIsIGJ1c19waW4pOwoJCQlpZiAoYnVzX3BpbiA+PSAxICYmIGJ1c19waW4gPD0gNikKCQkJCWRldl9wcml2LT5jcnRfZGRjX3BpbiA9IGJ1c19waW4gLSAxOwoJCX0gZWxzZSB7CgkJCURSTV9ERUJVR19LTVMoIkJEQl9HRCB0b28gc21hbGwgKCVkKS4gSW52YWxpZC5cbiIsCgkJCQkgIGJsb2NrX3NpemUpOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQKcGFyc2Vfc2R2b19kZXZpY2VfbWFwcGluZyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCgkJCSAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgKnBfbWFwcGluZzsKCXN0cnVjdCBiZGJfZ2VuZXJhbF9kZWZpbml0aW9ucyAqcF9kZWZzOwoJc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcgKnBfY2hpbGQ7CglpbnQgaSwgY2hpbGRfZGV2aWNlX251bSwgY291bnQ7Cgl1MTYJYmxvY2tfc2l6ZTsKCglwX2RlZnMgPSBmaW5kX3NlY3Rpb24oYmRiLCBCREJfR0VORVJBTF9ERUZJTklUSU9OUyk7CglpZiAoIXBfZGVmcykgewoJCURSTV9ERUJVR19LTVMoIk5vIGdlbmVyYWwgZGVmaW5pdGlvbiBibG9jayBpcyBmb3VuZCwgdW5hYmxlIHRvIGNvbnN0cnVjdCBzZHZvIG1hcHBpbmcuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBqdWRnZSB3aGV0aGVyIHRoZSBzaXplIG9mIGNoaWxkIGRldmljZSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLgoJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCgkgKiBpcyBkaWZmZXJlbnQgd2l0aCBzaXplb2Yoc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcpLCBza2lwIHRoZQoJICogcGFyc2luZyBvZiBzZHZvIGRldmljZSBpbmZvCgkgKi8KCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKCQkvKiBkaWZmZXJlbnQgY2hpbGQgZGV2IHNpemUgLiBJZ25vcmUgaXQgKi8KCQlEUk1fREVCVUdfS01TKCJkaWZmZXJlbnQgY2hpbGQgc2l6ZSBpcyBmb3VuZC4gSW52YWxpZC5cbiIpOwoJCXJldHVybjsKCX0KCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBnZW5lcmFsIGRlZmluaXRpb25zICovCglibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShwX2RlZnMpOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlICovCgljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KCQkJCXNpemVvZigqcF9jaGlsZCk7Cgljb3VudCA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgY2hpbGRfZGV2aWNlX251bTsgaSsrKSB7CgkJcF9jaGlsZCA9ICYocF9kZWZzLT5kZXZpY2VzW2ldKTsKCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CgkJCS8qIHNraXAgdGhlIGRldmljZSBibG9jayBpZiBkZXZpY2UgdHlwZSBpcyBpbnZhbGlkICovCgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocF9jaGlsZC0+c2xhdmVfYWRkciAhPSBTTEFWRV9BRERSMSAmJgoJCQlwX2NoaWxkLT5zbGF2ZV9hZGRyICE9IFNMQVZFX0FERFIyKSB7CgkJCS8qCgkJCSAqIElmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIG5laXRoZXIgMHg3MCBub3IgMHg3MiwKCQkJICogaXQgaXMgbm90IGEgU0RWTyBkZXZpY2UuIFNraXAgaXQuCgkJCSAqLwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBfY2hpbGQtPmR2b19wb3J0ICE9IERFVklDRV9QT1JUX0RWT0IgJiYKCQkJcF9jaGlsZC0+ZHZvX3BvcnQgIT0gREVWSUNFX1BPUlRfRFZPQykgewoJCQkvKiBza2lwIHRoZSBpbmNvcnJlY3QgU0RWTyBwb3J0ICovCgkJCURSTV9ERUJVR19LTVMoIkluY29ycmVjdCBTRFZPIHBvcnQuIFNraXAgaXQgXG4iKTsKCQkJY29udGludWU7CgkJfQoJCURSTV9ERUJVR19LTVMoInRoZSBTRFZPIGRldmljZSB3aXRoIHNsYXZlIGFkZHIgJTJ4IGlzIGZvdW5kIG9uIgoJCQkJIiAlcyBwb3J0XG4iLAoJCQkJcF9jaGlsZC0+c2xhdmVfYWRkciwKCQkJCShwX2NoaWxkLT5kdm9fcG9ydCA9PSBERVZJQ0VfUE9SVF9EVk9CKSA/CgkJCQkJIlNEVk9CIiA6ICJTRFZPQyIpOwoJCXBfbWFwcGluZyA9ICYoZGV2X3ByaXYtPnNkdm9fbWFwcGluZ3NbcF9jaGlsZC0+ZHZvX3BvcnQgLSAxXSk7CgkJaWYgKCFwX21hcHBpbmctPmluaXRpYWxpemVkKSB7CgkJCXBfbWFwcGluZy0+ZHZvX3BvcnQgPSBwX2NoaWxkLT5kdm9fcG9ydDsKCQkJcF9tYXBwaW5nLT5zbGF2ZV9hZGRyID0gcF9jaGlsZC0+c2xhdmVfYWRkcjsKCQkJcF9tYXBwaW5nLT5kdm9fd2lyaW5nID0gcF9jaGlsZC0+ZHZvX3dpcmluZzsKCQkJcF9tYXBwaW5nLT5kZGNfcGluID0gcF9jaGlsZC0+ZGRjX3BpbjsKCQkJcF9tYXBwaW5nLT5pbml0aWFsaXplZCA9IDE7CgkJfSBlbHNlIHsKCQkJRFJNX0RFQlVHX0tNUygiTWF5YmUgb25lIFNEVk8gcG9ydCBpcyBzaGFyZWQgYnkgIgoJCQkJCSAidHdvIFNEVk8gZGV2aWNlLlxuIik7CgkJfQoJCWlmIChwX2NoaWxkLT5zbGF2ZTJfYWRkcikgewoJCQkvKiBNYXliZSB0aGlzIGlzIGEgU0RWTyBkZXZpY2Ugd2l0aCBtdWx0aXBsZSBpbnB1dHMgKi8KCQkJLyogQW5kIHRoZSBtYXBwaW5nIGluZm8gaXMgbm90IGFkZGVkICovCgkJCURSTV9ERUJVR19LTVMoInRoZXJlIGV4aXN0cyB0aGUgc2xhdmUyX2FkZHIuIE1heWJlIHRoaXMiCgkJCQkiIGlzIGEgU0RWTyBkZXZpY2Ugd2l0aCBtdWx0aXBsZSBpbnB1dHMuXG4iKTsKCQl9CgkJY291bnQrKzsKCX0KCglpZiAoIWNvdW50KSB7CgkJLyogTm8gU0RWTyBkZXZpY2UgaW5mbyBpcyBmb3VuZCAqLwoJCURSTV9ERUJVR19LTVMoIk5vIFNEVk8gZGV2aWNlIGluZm8gaXMgZm91bmQgaW4gVkJUXG4iKTsKCX0KCXJldHVybjsKfQoKc3RhdGljIHZvaWQKcGFyc2VfZHJpdmVyX2ZlYXR1cmVzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKCQkgICAgICAgc3RydWN0IGJkYl9oZWFkZXIgKmJkYikKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7CglzdHJ1Y3QgYmRiX2RyaXZlcl9mZWF0dXJlcyAqZHJpdmVyOwoKCWRyaXZlciA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9EUklWRVJfRkVBVFVSRVMpOwoJaWYgKCFkcml2ZXIpCgkJcmV0dXJuOwoKCWlmIChkcml2ZXIgJiYgU1VQUE9SVFNfRURQKGRldikgJiYKCSAgICBkcml2ZXItPmx2ZHNfY29uZmlnID09IEJEQl9EUklWRVJfRkVBVFVSRV9FRFApIHsKCQlkZXZfcHJpdi0+ZWRwX3N1cHBvcnQgPSAxOwoJfSBlbHNlIHsKCQlkZXZfcHJpdi0+ZWRwX3N1cHBvcnQgPSAwOwoJfQoKCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5kdWFsX2ZyZXF1ZW5jeSkKCQlkZXZfcHJpdi0+cmVuZGVyX3JlY2xvY2tfYXZhaWwgPSB0cnVlOwp9CgpzdGF0aWMgdm9pZApwYXJzZV9lZHAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2VkcCAqZWRwOwoKCWVkcCA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9FRFApOwoJaWYgKCFlZHApIHsKCQlpZiAoU1VQUE9SVFNfRURQKGRldl9wcml2LT5kZXYpICYmIGRldl9wcml2LT5lZHBfc3VwcG9ydCkgewoJCQlEUk1fREVCVUdfS01TKCJObyBlRFAgQkRCIGZvdW5kIGJ1dCBlRFAgcGFuZWwgIgoJCQkJICAgICAgInN1cHBvcnRlZCwgYXNzdW1lIDE4YnBwIHBhbmVsIGNvbG9yICIKCQkJCSAgICAgICJkZXB0aC5cbiIpOwoJCQlkZXZfcHJpdi0+ZWRwX2JwcCA9IDE4OwoJCX0KCQlyZXR1cm47Cgl9CgoJc3dpdGNoICgoZWRwLT5jb2xvcl9kZXB0aCA+PiAocGFuZWxfdHlwZSAqIDIpKSAmIDMpIHsKCWNhc2UgRURQXzE4QlBQOgoJCWRldl9wcml2LT5lZHBfYnBwID0gMTg7CgkJYnJlYWs7CgljYXNlIEVEUF8yNEJQUDoKCQlkZXZfcHJpdi0+ZWRwX2JwcCA9IDI0OwoJCWJyZWFrOwoJY2FzZSBFRFBfMzBCUFA6CgkJZGV2X3ByaXYtPmVkcF9icHAgPSAzMDsKCQlicmVhazsKCX0KfQoKc3RhdGljIHZvaWQKcGFyc2VfZGV2aWNlX21hcHBpbmcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAoJCSAgICAgICBzdHJ1Y3QgYmRiX2hlYWRlciAqYmRiKQp7CglzdHJ1Y3QgYmRiX2dlbmVyYWxfZGVmaW5pdGlvbnMgKnBfZGVmczsKCXN0cnVjdCBjaGlsZF9kZXZpY2VfY29uZmlnICpwX2NoaWxkLCAqY2hpbGRfZGV2X3B0cjsKCWludCBpLCBjaGlsZF9kZXZpY2VfbnVtLCBjb3VudDsKCXUxNglibG9ja19zaXplOwoKCXBfZGVmcyA9IGZpbmRfc2VjdGlvbihiZGIsIEJEQl9HRU5FUkFMX0RFRklOSVRJT05TKTsKCWlmICghcF9kZWZzKSB7CgkJRFJNX0RFQlVHX0tNUygiTm8gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrIGlzIGZvdW5kLCBubyBkZXZpY2VzIGRlZmluZWQuXG4iKTsKCQlyZXR1cm47Cgl9CgkvKiBqdWRnZSB3aGV0aGVyIHRoZSBzaXplIG9mIGNoaWxkIGRldmljZSBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLgoJICogSWYgdGhlIGNoaWxkIGRldmljZSBzaXplIG9idGFpbmVkIGZyb20gZ2VuZXJhbCBkZWZpbml0aW9uIGJsb2NrCgkgKiBpcyBkaWZmZXJlbnQgd2l0aCBzaXplb2Yoc3RydWN0IGNoaWxkX2RldmljZV9jb25maWcpLCBza2lwIHRoZQoJICogcGFyc2luZyBvZiBzZHZvIGRldmljZSBpbmZvCgkgKi8KCWlmIChwX2RlZnMtPmNoaWxkX2Rldl9zaXplICE9IHNpemVvZigqcF9jaGlsZCkpIHsKCQkvKiBkaWZmZXJlbnQgY2hpbGQgZGV2IHNpemUgLiBJZ25vcmUgaXQgKi8KCQlEUk1fREVCVUdfS01TKCJkaWZmZXJlbnQgY2hpbGQgc2l6ZSBpcyBmb3VuZC4gSW52YWxpZC5cbiIpOwoJCXJldHVybjsKCX0KCS8qIGdldCB0aGUgYmxvY2sgc2l6ZSBvZiBnZW5lcmFsIGRlZmluaXRpb25zICovCglibG9ja19zaXplID0gZ2V0X2Jsb2Nrc2l6ZShwX2RlZnMpOwoJLyogZ2V0IHRoZSBudW1iZXIgb2YgY2hpbGQgZGV2aWNlICovCgljaGlsZF9kZXZpY2VfbnVtID0gKGJsb2NrX3NpemUgLSBzaXplb2YoKnBfZGVmcykpIC8KCQkJCXNpemVvZigqcF9jaGlsZCk7Cgljb3VudCA9IDA7CgkvKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZCBkZXZpY2UgdGhhdCBpcyBwcmVzZW50ICovCglmb3IgKGkgPSAwOyBpIDwgY2hpbGRfZGV2aWNlX251bTsgaSsrKSB7CgkJcF9jaGlsZCA9ICYocF9kZWZzLT5kZXZpY2VzW2ldKTsKCQlpZiAoIXBfY2hpbGQtPmRldmljZV90eXBlKSB7CgkJCS8qIHNraXAgdGhlIGRldmljZSBibG9jayBpZiBkZXZpY2UgdHlwZSBpcyBpbnZhbGlkICovCgkJCWNvbnRpbnVlOwoJCX0KCQljb3VudCsrOwoJfQoJaWYgKCFjb3VudCkgewoJCURSTV9ERUJVR19LTVMoIm5vIGNoaWxkIGRldiBpcyBwYXJzZWQgZnJvbSBWQlQgXG4iKTsKCQlyZXR1cm47Cgl9CglkZXZfcHJpdi0+Y2hpbGRfZGV2ID0ga3phbGxvYyhzaXplb2YoKnBfY2hpbGQpICogY291bnQsIEdGUF9LRVJORUwpOwoJaWYgKCFkZXZfcHJpdi0+Y2hpbGRfZGV2KSB7CgkJRFJNX0RFQlVHX0tNUygiTm8gbWVtb3J5IHNwYWNlIGZvciBjaGlsZCBkZXZpY2VcbiIpOwoJCXJldHVybjsKCX0KCglkZXZfcHJpdi0+Y2hpbGRfZGV2X251bSA9IGNvdW50OwoJY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IGNoaWxkX2RldmljZV9udW07IGkrKykgewoJCXBfY2hpbGQgPSAmKHBfZGVmcy0+ZGV2aWNlc1tpXSk7CgkJaWYgKCFwX2NoaWxkLT5kZXZpY2VfdHlwZSkgewoJCQkvKiBza2lwIHRoZSBkZXZpY2UgYmxvY2sgaWYgZGV2aWNlIHR5cGUgaXMgaW52YWxpZCAqLwoJCQljb250aW51ZTsKCQl9CgkJY2hpbGRfZGV2X3B0ciA9IGRldl9wcml2LT5jaGlsZF9kZXYgKyBjb3VudDsKCQljb3VudCsrOwoJCW1lbWNweSgodm9pZCAqKWNoaWxkX2Rldl9wdHIsICh2b2lkICopcF9jaGlsZCwKCQkJCQlzaXplb2YoKnBfY2hpbGQpKTsKCX0KCXJldHVybjsKfQoKLyoqCiAqIGludGVsX2luaXRfYmlvcyAtIGluaXRpYWxpemUgVkJJT1Mgc2V0dGluZ3MgJiBmaW5kIFZCVAogKiBAZGV2OiBEUk0gZGV2aWNlCiAqCiAqIExvYWRzIHRoZSBWaWRlbyBCSU9TIGFuZCBjaGVja3MgdGhhdCB0aGUgVkJUIGV4aXN0cy4gIFNldHMgc2NyYXRjaCByZWdpc3RlcnMKICogdG8gYXBwcm9wcmlhdGUgdmFsdWVzLgogKgogKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBmYWlsdXJlLgogKi8KYm9vbAppbnRlbF9pbml0X2Jpb3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2LT5wZGV2OwoJc3RydWN0IGJkYl9oZWFkZXIgKmJkYiA9IE5VTEw7Cgl1OCBfX2lvbWVtICpiaW9zID0gTlVMTDsKCglkZXZfcHJpdi0+Y3J0X2RkY19waW4gPSBHTUJVU19QT1JUX1ZHQUREQzsKCgkvKiBYWFggU2hvdWxkIHRoaXMgdmFsaWRhdGlvbiBiZSBtb3ZlZCB0byBpbnRlbF9vcHJlZ2lvbi5jPyAqLwoJaWYgKGRldl9wcml2LT5vcHJlZ2lvbi52YnQpIHsKCQlzdHJ1Y3QgdmJ0X2hlYWRlciAqdmJ0ID0gZGV2X3ByaXYtPm9wcmVnaW9uLnZidDsKCQlpZiAobWVtY21wKHZidC0+c2lnbmF0dXJlLCAiJFZCVCIsIDQpID09IDApIHsKCQkJRFJNX0RFQlVHX0RSSVZFUigiVXNpbmcgVkJUIGZyb20gT3BSZWdpb246ICUyMHNcbiIsCgkJCQkJIHZidC0+c2lnbmF0dXJlKTsKCQkJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKChjaGFyICopdmJ0ICsgdmJ0LT5iZGJfb2Zmc2V0KTsKCQl9IGVsc2UKCQkJZGV2X3ByaXYtPm9wcmVnaW9uLnZidCA9IE5VTEw7Cgl9CgoJaWYgKGJkYiA9PSBOVUxMKSB7CgkJc3RydWN0IHZidF9oZWFkZXIgKnZidCA9IE5VTEw7CgkJc2l6ZV90IHNpemU7CgkJaW50IGk7CgoJCWJpb3MgPSBwY2lfbWFwX3JvbShwZGV2LCAmc2l6ZSk7CgkJaWYgKCFiaW9zKQoJCQlyZXR1cm4gLTE7CgoJCS8qIFNjb3VyIG1lbW9yeSBsb29raW5nIGZvciB0aGUgVkJUIHNpZ25hdHVyZSAqLwoJCWZvciAoaSA9IDA7IGkgKyA0IDwgc2l6ZTsgaSsrKSB7CgkJCWlmICghbWVtY21wKGJpb3MgKyBpLCAiJFZCVCIsIDQpKSB7CgkJCQl2YnQgPSAoc3RydWN0IHZidF9oZWFkZXIgKikoYmlvcyArIGkpOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmICghdmJ0KSB7CgkJCURSTV9FUlJPUigiVkJUIHNpZ25hdHVyZSBtaXNzaW5nXG4iKTsKCQkJcGNpX3VubWFwX3JvbShwZGV2LCBiaW9zKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJYmRiID0gKHN0cnVjdCBiZGJfaGVhZGVyICopKGJpb3MgKyBpICsgdmJ0LT5iZGJfb2Zmc2V0KTsKCX0KCgkvKiBHcmFiIHVzZWZ1bCBnZW5lcmFsIGRlZmluaXRpb25zICovCglwYXJzZV9nZW5lcmFsX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZ2VuZXJhbF9kZWZpbml0aW9ucyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2xmcF9wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwoJcGFyc2Vfc2R2b19wYW5lbF9kYXRhKGRldl9wcml2LCBiZGIpOwoJcGFyc2Vfc2R2b19kZXZpY2VfbWFwcGluZyhkZXZfcHJpdiwgYmRiKTsKCXBhcnNlX2RldmljZV9tYXBwaW5nKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZHJpdmVyX2ZlYXR1cmVzKGRldl9wcml2LCBiZGIpOwoJcGFyc2VfZWRwKGRldl9wcml2LCBiZGIpOwoKCWlmIChiaW9zKQoJCXBjaV91bm1hcF9yb20ocGRldiwgYmlvcyk7CgoJcmV0dXJuIDA7Cn0K