LyoKICoJRXhlY3V0aXZlIE9TTQogKgogKiAJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIJUmVkIEhhdCBTb2Z0d2FyZQogKgogKglXcml0dGVuIGJ5IEFsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkCiAqCiAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCiAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqCUEgbG90IG9mIHRoZSBJMk8gbWVzc2FnZSBzaWRlIGNvZGUgZnJvbSB0aGlzIGlzIHRha2VuIGZyb20gdGhlIFJlZAogKglDcmVlayBSQ1BDSTQ1IGFkYXB0ZXIgZHJpdmVyIGJ5IFJlZCBDcmVlayBDb21tdW5pY2F0aW9ucwogKgogKglGaXhlcy9hZGRpdGlvbnM6CiAqCQlQaGlsaXBwIFJ1bXBmCiAqCQlKdWhhIFNpZXbkbmVuIDxKdWhhLlNpZXZhbmVuQGNzLkhlbHNpbmtpLkZJPgogKgkJQXV2byBI5GtraW5lbiA8QXV2by5IYWtraW5lbkBjcy5IZWxzaW5raS5GST4KICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KICoJCUJvamkgVCBLYW5uYW50aGFuYW0gPGJvamkudC5rYW5uYW50aGFuYW1AaW50ZWwuY29tPgogKgkJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CiAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKICoJCQlNaW5vciBmaXhlcyBmb3IgMi42LgogKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgogKgkJCVN1cHBvcnQgZm9yIHN5c2ZzIGluY2x1ZGVkLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2kyby5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgpIG5lZWRzIHRoaXMgKi8KI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgkJLyogSFogKi8KI2luY2x1ZGUgImNvcmUuaCIKCiNkZWZpbmUgT1NNX05BTUUgImV4ZWMtb3NtIgoKc3RydWN0IGkyb19kcml2ZXIgaTJvX2V4ZWNfZHJpdmVyOwoKc3RhdGljIGludCBpMm9fZXhlY19sY3Rfbm90aWZ5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIGNoYW5nZV9pbmQpOwoKLyogZ2xvYmFsIHdhaXQgbGlzdCBmb3IgUE9TVCBXQUlUICovCnN0YXRpYyBMSVNUX0hFQUQoaTJvX2V4ZWNfd2FpdF9saXN0KTsKCi8qIFdhaXQgc3RydWN0IG5lZWRlZCBmb3IgUE9TVCBXQUlUICovCnN0cnVjdCBpMm9fZXhlY193YWl0IHsKCXdhaXRfcXVldWVfaGVhZF90ICp3cTsJLyogUG9pbnRlciB0byBXYWl0IHF1ZXVlICovCglzdHJ1Y3QgaTJvX2RtYSBkbWE7CS8qIERNQSBidWZmZXJzIHRvIGZyZWUgb24gZmFpbHVyZSAqLwoJdTMyIHRjbnR4dDsJCS8qIHRyYW5zYWN0aW9uIGNvbnRleHQgZnJvbSByZXBseSAqLwoJaW50IGNvbXBsZXRlOwkJLyogMSBpZiByZXBseSByZWNlaXZlZCBvdGhlcndpc2UgMCAqLwoJdTMyIG07CQkJLyogbWVzc2FnZSBpZCAqLwoJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CS8qIHBvaW50ZXIgdG8gdGhlIHJlcGx5IG1lc3NhZ2UgKi8KCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbm9kZSBpbiBnbG9iYWwgd2FpdCBsaXN0ICovCglzcGlubG9ja190IGxvY2s7CS8qIGxvY2sgYmVmb3JlIG1vZGlmeWluZyAqLwp9OwoKLyogV29yayBzdHJ1Y3QgbmVlZGVkIHRvIGhhbmRsZSBMQ1QgTk9USUZZIHJlcGxpZXMgKi8Kc3RydWN0IGkyb19leGVjX2xjdF9ub3RpZnlfd29yayB7CglzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsJLyogd29yayBzdHJ1Y3QgKi8KCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsJLyogY29udHJvbGxlciBvbiB3aGljaCB0aGUgTENUIE5PVElGWQoJCQkJCSAgIHdhcyByZWNlaXZlZCAqLwp9OwoKLyogRXhlYyBPU00gY2xhc3MgaGFuZGxpbmcgZGVmaW5pdGlvbiAqLwpzdGF0aWMgc3RydWN0IGkyb19jbGFzc19pZCBpMm9fZXhlY19jbGFzc19pZFtdID0gewoJe0kyT19DTEFTU19FWEVDVVRJVkV9LAoJe0kyT19DTEFTU19FTkR9Cn07CgovKioKICoJaTJvX2V4ZWNfd2FpdF9hbGxvYyAtIEFsbG9jYXRlIGEgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgYW4gaW5pdGlhbGl6ZSBpdAogKgogKglBbGxvY2F0ZSB0aGUgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgYW5kIGluaXRpYWxpemUgdGhlIHdhaXQuCiAqCiAqCVJldHVybnMgaTJvX2V4ZWNfd2FpdCBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbgogKglmYWlsdXJlLgogKi8Kc3RhdGljIHN0cnVjdCBpMm9fZXhlY193YWl0ICppMm9fZXhlY193YWl0X2FsbG9jKHZvaWQpCnsKCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OwoKCXdhaXQgPSBremFsbG9jKHNpemVvZigqd2FpdCksIEdGUF9LRVJORUwpOwoJaWYgKCF3YWl0KQoJCXJldHVybiBOVUxMOwoKCUlOSVRfTElTVF9IRUFEKCZ3YWl0LT5saXN0KTsKCXNwaW5fbG9ja19pbml0KCZ3YWl0LT5sb2NrKTsKCglyZXR1cm4gd2FpdDsKfTsKCi8qKgogKglpMm9fZXhlY193YWl0X2ZyZWUgLSBGcmVlIGFuIGkyb19leGVjX3dhaXQgc3RydWN0CiAqCUB3YWl0OiBJMk8gd2FpdCBkYXRhIHdoaWNoIHNob3VsZCBiZSBjbGVhbmVkIHVwCiAqLwpzdGF0aWMgdm9pZCBpMm9fZXhlY193YWl0X2ZyZWUoc3RydWN0IGkyb19leGVjX3dhaXQgKndhaXQpCnsKCWtmcmVlKHdhaXQpOwp9OwoKLyoqCiAqIAlpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0gLSBQb3N0IGFuZCB3YWl0IGEgbWVzc2FnZSB3aXRoIERNQSBidWZmZXJzCiAqCUBjOiBjb250cm9sbGVyCiAqCUBtc2c6IG1lc3NhZ2UgdG8gcG9zdAogKglAdGltZW91dDogdGltZSBpbiBzZWNvbmRzIHRvIHdhaXQKICoJQGRtYTogaTJvX2RtYSBzdHJ1Y3Qgb2YgdGhlIERNQSBidWZmZXIgdG8gZnJlZSBvbiBmYWlsdXJlCiAqCiAqIAlUaGlzIEFQSSBhbGxvd3MgYW4gT1NNIHRvIHBvc3QgYSBtZXNzYWdlIGFuZCB0aGVuIGJlIHRvbGQgd2hldGhlciBvcgogKglub3QgdGhlIHN5c3RlbSByZWNlaXZlZCBhIHN1Y2Nlc3NmdWwgcmVwbHkuIElmIHRoZSBtZXNzYWdlIHRpbWVzIG91dAogKgl0aGVuIHRoZSB2YWx1ZSAnLUVUSU1FRE9VVCcgaXMgcmV0dXJuZWQuIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIEluCiAqCXRoaXMgc2l0dWF0aW9uIHRoZSBtZXNzYWdlIG1heSAoc2hvdWxkKSBjb21wbGV0ZSBhdCBhbiBpbmRlZmluaXRlIHRpbWUKICoJaW4gdGhlIGZ1dHVyZS4gV2hlbiBpdCBjb21wbGV0ZXMgaXQgd2lsbCB1c2UgdGhlIG1lbW9yeSBidWZmZXIKICoJYXR0YWNoZWQgdG8gdGhlIHJlcXVlc3QuIElmIC1FVElNRURPVVQgaXMgcmV0dXJuZWQgdGhlbiB0aGUgbWVtb3J5CiAqCWJ1ZmZlciBtdXN0IG5vdCBiZSBmcmVlZC4gSW5zdGVhZCB0aGUgZXZlbnQgY29tcGxldGlvbiB3aWxsIGZyZWUgdGhlbQogKglmb3IgeW91LiBJbiBhbGwgb3RoZXIgY2FzZXMgdGhlIGJ1ZmZlciBhcmUgeW91ciBwcm9ibGVtLgogKgogKglSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiB0aW1lb3V0IG9yIHBvc2l0aXZlIGVycm9yCiAqCWNvZGUgZnJvbSByZXBseS4KICovCmludCBpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0oc3RydWN0IGkyb19jb250cm9sbGVyICpjLCBzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZywKCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsIHN0cnVjdCBpMm9fZG1hICpkbWEpCnsKCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEX09OU1RBQ0sod3EpOwoJc3RydWN0IGkyb19leGVjX3dhaXQgKndhaXQ7CglzdGF0aWMgdTMyIHRjbnR4dCA9IDB4ODAwMDAwMDA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IHJjID0gMDsKCgl3YWl0ID0gaTJvX2V4ZWNfd2FpdF9hbGxvYygpOwoJaWYgKCF3YWl0KQoJCXJldHVybiAtRU5PTUVNOwoKCWlmICh0Y250eHQgPT0gMHhmZmZmZmZmZikKCQl0Y250eHQgPSAweDgwMDAwMDAwOwoKCWlmIChkbWEpCgkJd2FpdC0+ZG1hID0gKmRtYTsKCgkvKgoJICogRmlsbCBpbiB0aGUgbWVzc2FnZSBpbml0aWF0b3IgY29udGV4dCBhbmQgdHJhbnNhY3Rpb24gY29udGV4dC4KCSAqIFdlIHdpbGwgb25seSB1c2UgdHJhbnNhY3Rpb24gY29udGV4dHMgPj0gMHg4MDAwMDAwMCBmb3IgUE9TVCBXQUlULAoJICogc28gd2UgY291bGQgZmluZCBhIFBPU1QgV0FJVCByZXBseSBlYXNpZXIgaW4gdGhlIHJlcGx5IGhhbmRsZXIuCgkgKi8KCW1zZy0+dS5zLmljbnR4dCA9IGNwdV90b19sZTMyKGkyb19leGVjX2RyaXZlci5jb250ZXh0KTsKCXdhaXQtPnRjbnR4dCA9IHRjbnR4dCsrOwoJbXNnLT51LnMudGNudHh0ID0gY3B1X3RvX2xlMzIod2FpdC0+dGNudHh0KTsKCgl3YWl0LT53cSA9ICZ3cTsKCS8qCgkgKiB3ZSBhZGQgZWxlbWVudHMgdG8gdGhlIGhlYWQsIGJlY2F1c2UgaWYgYSBlbnRyeSBpbiB0aGUgbGlzdCB3aWxsCgkgKiBuZXZlciBiZSByZW1vdmVkLCB3ZSBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBpdCBldmVyeSB0aW1lCgkgKi8KCWxpc3RfYWRkKCZ3YWl0LT5saXN0LCAmaTJvX2V4ZWNfd2FpdF9saXN0KTsKCgkvKgoJICogUG9zdCB0aGUgbWVzc2FnZSB0byB0aGUgY29udHJvbGxlci4gQXQgc29tZSBwb2ludCBsYXRlciBpdCB3aWxsCgkgKiByZXR1cm4uIElmIHdlIHRpbWUgb3V0IGJlZm9yZSBpdCByZXR1cm5zIHRoZW4gY29tcGxldGUgd2lsbCBiZSB6ZXJvLgoJICovCglpMm9fbXNnX3Bvc3QoYywgbXNnKTsKCgl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cSwgd2FpdC0+Y29tcGxldGUsIHRpbWVvdXQgKiBIWik7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJndhaXQtPmxvY2ssIGZsYWdzKTsKCgl3YWl0LT53cSA9IE5VTEw7CgoJaWYgKHdhaXQtPmNvbXBsZXRlKQoJCXJjID0gbGUzMl90b19jcHUod2FpdC0+bXNnLT5ib2R5WzBdKSA+PiAyNDsKCWVsc2UgewoJCS8qCgkJICogV2UgY2Fubm90IHJlbW92ZSBpdCBub3cuIFRoaXMgaXMgaW1wb3J0YW50LiBXaGVuIGl0IGRvZXMKCQkgKiB0ZXJtaW5hdGUgKHdoaWNoIGl0IG11c3QgZG8gaWYgdGhlIGNvbnRyb2xsZXIgaGFzIG5vdAoJCSAqIGRpZWQuLi4pIHRoZW4gaXQgd2lsbCBvdGhlcndpc2Ugc2NyaWJibGUgb24gc3R1ZmYuCgkJICoKCQkgKiBGSVhNRTogdHJ5IGFib3J0IG1lc3NhZ2UKCQkgKi8KCQlpZiAoZG1hKQoJCQlkbWEtPnZpcnQgPSBOVUxMOwoKCQlyYyA9IC1FVElNRURPVVQ7Cgl9CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2FpdC0+bG9jaywgZmxhZ3MpOwoKCWlmIChyYyAhPSAtRVRJTUVET1VUKSB7CgkJaTJvX2ZsdXNoX3JlcGx5KGMsIHdhaXQtPm0pOwoJCWkyb19leGVjX3dhaXRfZnJlZSh3YWl0KTsKCX0KCglyZXR1cm4gcmM7Cn07CgovKioKICoJaTJvX21zZ19wb3N0X3dhaXRfY29tcGxldGUgLSBSZXBseSB0byBhIGkyb19tc2dfcG9zdCByZXF1ZXN0IGZyb20gSU9QCiAqCUBjOiBJMk8gY29udHJvbGxlciB3aGljaCBhbnN3ZXJzCiAqCUBtOiBtZXNzYWdlIGlkCiAqCUBtc2c6IHBvaW50ZXIgdG8gdGhlIEkyTyByZXBseSBtZXNzYWdlCiAqCUBjb250ZXh0OiB0cmFuc2FjdGlvbiBjb250ZXh0IG9mIHJlcXVlc3QKICoKICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQgb25seS4gSWYgdGhlIHJlcGx5IHJlYWNoZWQKICoJYmVmb3JlIHRoZSB0aW1lb3V0LCB0aGUgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgaXMgZmlsbGVkIHdpdGggdGhlIG1lc3NhZ2UKICoJYW5kIHRoZSB0YXNrIHdpbGwgYmUgd2FrZWQgdXAuIFRoZSB0YXNrIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nCiAqCXRoZSBtZXNzYWdlIG0gYmFjayB0byB0aGUgY29udHJvbGxlciEgSWYgdGhlIG1lc3NhZ2UgcmVhY2hlcyB1cyBhZnRlcgogKgl0aGUgdGltZW91dCBjbGVhbiB1cCB0aGUgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgKGluY2x1ZGluZyBhbGxvY2F0ZWQKICoJRE1BIGJ1ZmZlcikuCiAqCiAqCVJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSBtZXNzYWdlIG0gc2hvdWxkIG5vdCBiZSBnaXZlbiBiYWNrIHRvIHRoZQogKglJMk8gY29udHJvbGxlciwgb3IgPjAgb24gc3VjY2VzcyBhbmQgaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGdpdmVuIGJhY2sKICoJYWZ0ZXJ3b3Jkcy4gUmV0dXJucyBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuIEluIHRoaXMgY2FzZSB0aGUKICoJbWVzc2FnZSBtdXN0IGFsc28gYmUgZ2l2ZW4gYmFjayB0byB0aGUgY29udHJvbGxlci4KICovCnN0YXRpYyBpbnQgaTJvX21zZ19wb3N0X3dhaXRfY29tcGxldGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwKCQkJCSAgICAgIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnLCB1MzIgY29udGV4dCkKewoJc3RydWN0IGkyb19leGVjX3dhaXQgKndhaXQsICp0bXA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IHJjID0gMTsKCgkvKgoJICogV2UgbmVlZCB0byBzZWFyY2ggdGhyb3VnaCB0aGUgaTJvX2V4ZWNfd2FpdF9saXN0IHRvIHNlZSBpZiB0aGUgZ2l2ZW4KCSAqIG1lc3NhZ2UgaXMgc3RpbGwgb3V0c3RhbmRpbmcuIElmIG5vdCwgaXQgbWVhbnMgdGhhdCB0aGUgSU9QIHRvb2sKCSAqIGxvbmdlciB0byByZXNwb25kIHRvIHRoZSBtZXNzYWdlIHRoYW4gd2UgaGFkIGFsbG93ZWQgYW5kIHRpbWVyIGhhcwoJICogYWxyZWFkeSBleHBpcmVkLiBOb3QgbXVjaCB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBleGNlcHQgbG9nIGl0IGZvcgoJICogZGVidWcgcHVycG9zZXMsIGluY3JlYXNlIHRpbWVvdXQsIGFuZCByZWNvbXBpbGUuCgkgKi8KCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0LCB0bXAsICZpMm9fZXhlY193YWl0X2xpc3QsIGxpc3QpIHsKCQlpZiAod2FpdC0+dGNudHh0ID09IGNvbnRleHQpIHsKCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndhaXQtPmxvY2ssIGZsYWdzKTsKCgkJCWxpc3RfZGVsKCZ3YWl0LT5saXN0KTsKCgkJCXdhaXQtPm0gPSBtOwoJCQl3YWl0LT5tc2cgPSBtc2c7CgkJCXdhaXQtPmNvbXBsZXRlID0gMTsKCgkJCWlmICh3YWl0LT53cSkKCQkJCXJjID0gMDsKCQkJZWxzZQoJCQkJcmMgPSAtMTsKCgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhaXQtPmxvY2ssIGZsYWdzKTsKCgkJCWlmIChyYykgewoJCQkJc3RydWN0IGRldmljZSAqZGV2OwoKCQkJCWRldiA9ICZjLT5wZGV2LT5kZXY7CgoJCQkJcHJfZGVidWcoIiVzOiB0aW1lZG91dCByZXBseSByZWNlaXZlZCFcbiIsCgkJCQkJIGMtPm5hbWUpOwoJCQkJaTJvX2RtYV9mcmVlKGRldiwgJndhaXQtPmRtYSk7CgkJCQlpMm9fZXhlY193YWl0X2ZyZWUod2FpdCk7CgkJCX0gZWxzZQoJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHdhaXQtPndxKTsKCgkJCXJldHVybiByYzsKCQl9Cgl9CgoJb3NtX3dhcm4oIiVzOiBCb2d1cyByZXBseSBpbiBQT1NUIFdBSVQgKHRyLWNvbnRleHQ6ICUwOHgpIVxuIiwgYy0+bmFtZSwKCQkgY29udGV4dCk7CgoJcmV0dXJuIC0xOwp9OwoKLyoqCiAqCWkyb19leGVjX3Nob3dfdmVuZG9yX2lkIC0gRGlzcGxheXMgVmVuZG9yIElEIG9mIGNvbnRyb2xsZXIKICoJQGQ6IGRldmljZSBvZiB3aGljaCB0aGUgVmVuZG9yIElEIHNob3VsZCBiZSBkaXNwbGF5ZWQKICoJQGF0dHI6IGRldmljZV9hdHRyaWJ1dGUgdG8gZGlzcGxheQogKglAYnVmOiBidWZmZXIgaW50byB3aGljaCB0aGUgVmVuZG9yIElEIHNob3VsZCBiZSBwcmludGVkCiAqCiAqCVJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgaW50byBidWZmZXIuCiAqLwpzdGF0aWMgc3NpemVfdCBpMm9fZXhlY19zaG93X3ZlbmRvcl9pZChzdHJ1Y3QgZGV2aWNlICpkLAoJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYgPSB0b19pMm9fZGV2aWNlKGQpOwoJdTE2IGlkOwoKCWlmICghaTJvX3Bhcm1fZmllbGRfZ2V0KGRldiwgMHgwMDAwLCAwLCAmaWQsIDIpKSB7CgkJc3ByaW50ZihidWYsICIweCUwNHgiLCBsZTE2X3RvX2NwdShpZCkpOwoJCXJldHVybiBzdHJsZW4oYnVmKSArIDE7Cgl9CgoJcmV0dXJuIDA7Cn07CgovKioKICoJaTJvX2V4ZWNfc2hvd19wcm9kdWN0X2lkIC0gRGlzcGxheXMgUHJvZHVjdCBJRCBvZiBjb250cm9sbGVyCiAqCUBkOiBkZXZpY2Ugb2Ygd2hpY2ggdGhlIFByb2R1Y3QgSUQgc2hvdWxkIGJlIGRpc3BsYXllZAogKglAYXR0cjogZGV2aWNlX2F0dHJpYnV0ZSB0byBkaXNwbGF5CiAqCUBidWY6IGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBQcm9kdWN0IElEIHNob3VsZCBiZSBwcmludGVkCiAqCiAqCVJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgaW50byBidWZmZXIuCiAqLwpzdGF0aWMgc3NpemVfdCBpMm9fZXhlY19zaG93X3Byb2R1Y3RfaWQoc3RydWN0IGRldmljZSAqZCwKCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJCQljaGFyICpidWYpCnsKCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYgPSB0b19pMm9fZGV2aWNlKGQpOwoJdTE2IGlkOwoKCWlmICghaTJvX3Bhcm1fZmllbGRfZ2V0KGRldiwgMHgwMDAwLCAxLCAmaWQsIDIpKSB7CgkJc3ByaW50ZihidWYsICIweCUwNHgiLCBsZTE2X3RvX2NwdShpZCkpOwoJCXJldHVybiBzdHJsZW4oYnVmKSArIDE7Cgl9CgoJcmV0dXJuIDA7Cn07CgovKiBFeGVjLU9TTSBkZXZpY2UgYXR0cmlidXRlcyAqLwpzdGF0aWMgREVWSUNFX0FUVFIodmVuZG9yX2lkLCBTX0lSVUdPLCBpMm9fZXhlY19zaG93X3ZlbmRvcl9pZCwgTlVMTCk7CnN0YXRpYyBERVZJQ0VfQVRUUihwcm9kdWN0X2lkLCBTX0lSVUdPLCBpMm9fZXhlY19zaG93X3Byb2R1Y3RfaWQsIE5VTEwpOwoKLyoqCiAqCWkyb19leGVjX3Byb2JlIC0gQ2FsbGVkIGlmIGEgbmV3IEkyTyBkZXZpY2UgKGV4ZWN1dGl2ZSBjbGFzcykgYXBwZWFycwogKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCBiZSBwcm9iZWQKICoKICoJUmVnaXN0ZXJzIGV2ZW50IG5vdGlmaWNhdGlvbiBmb3IgZXZlcnkgZXZlbnQgZnJvbSBFeGVjdXRpdmUgZGV2aWNlLiBUaGUKICoJcmV0dXJuIGlzIGFsd2F5cyAwLCBiZWNhdXNlIHdlIHdhbnQgYWxsIGRldmljZXMgb2YgY2xhc3MgRXhlY3V0aXZlLgogKgogKglSZXR1cm5zIDAgb24gc3VjY2Vzcy4KICovCnN0YXRpYyBpbnQgaTJvX2V4ZWNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQp7CglzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKCWludCByYzsKCglyYyA9IGkyb19ldmVudF9yZWdpc3RlcihpMm9fZGV2LCAmaTJvX2V4ZWNfZHJpdmVyLCAwLCAweGZmZmZmZmZmKTsKCWlmIChyYykgZ290byBlcnJfb3V0OwoKCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZlbmRvcl9pZCk7CglpZiAocmMpIGdvdG8gZXJyX2V2dHJlZzsKCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3RfaWQpOwoJaWYgKHJjKSBnb3RvIGVycl92aWQ7CgoJcmV0dXJuIDA7CgplcnJfdmlkOgoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3ZlbmRvcl9pZCk7CmVycl9ldnRyZWc6CglpMm9fZXZlbnRfcmVnaXN0ZXIodG9faTJvX2RldmljZShkZXYpLCAmaTJvX2V4ZWNfZHJpdmVyLCAwLCAwKTsKZXJyX291dDoKCXJldHVybiByYzsKfTsKCi8qKgogKglpMm9fZXhlY19yZW1vdmUgLSBDYWxsZWQgb24gSTJPIGRldmljZSByZW1vdmFsCiAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggd2FzIHJlbW92ZWQKICoKICoJVW5yZWdpc3RlcnMgZXZlbnQgbm90aWZpY2F0aW9uIGZyb20gRXhlY3V0aXZlIEkyTyBkZXZpY2UuCiAqCiAqCVJldHVybnMgMCBvbiBzdWNjZXNzLgogKi8Kc3RhdGljIGludCBpMm9fZXhlY19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQp7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcHJvZHVjdF9pZCk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdmVuZG9yX2lkKTsKCglpMm9fZXZlbnRfcmVnaXN0ZXIodG9faTJvX2RldmljZShkZXYpLCAmaTJvX2V4ZWNfZHJpdmVyLCAwLCAwKTsKCglyZXR1cm4gMDsKfTsKCi8qKgogKglpMm9fZXhlY19sY3RfbW9kaWZpZWQgLSBDYWxsZWQgb24gTENUIE5PVElGWSByZXBseQogKglAX3dvcms6IHdvcmsgc3RydWN0IGZvciBhIHNwZWNpZmljIGNvbnRyb2xsZXIKICoKICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFzeW5jaHJvbnVzIExDVCBOT1RJRlkgcmVwbGllcy4gSXQgcGFyc2VzIHRoZQogKgluZXcgTENUIGFuZCBpZiB0aGUgYnVmZmVyIGZvciB0aGUgTENUIHdhcyB0byBzbWFsbCBzZW5kcyBhIExDVCBOT1RJRlkKICoJYWdhaW4sIG90aGVyd2lzZSBzZW5kIExDVCBOT1RJRlkgdG8gZ2V0IGluZm9ybWVkIG9uIG5leHQgTENUIGNoYW5nZS4KICovCnN0YXRpYyB2b2lkIGkyb19leGVjX2xjdF9tb2RpZmllZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKl93b3JrKQp7CglzdHJ1Y3QgaTJvX2V4ZWNfbGN0X25vdGlmeV93b3JrICp3b3JrID0KCQljb250YWluZXJfb2YoX3dvcmssIHN0cnVjdCBpMm9fZXhlY19sY3Rfbm90aWZ5X3dvcmssIHdvcmspOwoJdTMyIGNoYW5nZV9pbmQgPSAwOwoJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gd29yay0+YzsKCglrZnJlZSh3b3JrKTsKCglpZiAoaTJvX2RldmljZV9wYXJzZV9sY3QoYykgIT0gLUVBR0FJTikKCQljaGFuZ2VfaW5kID0gYy0+bGN0LT5jaGFuZ2VfaW5kICsgMTsKCiNpZmRlZiBDT05GSUdfSTJPX0xDVF9OT1RJRllfT05fQ0hBTkdFUwoJaTJvX2V4ZWNfbGN0X25vdGlmeShjLCBjaGFuZ2VfaW5kKTsKI2VuZGlmCn07CgovKioKICoJaTJvX2V4ZWNfcmVwbHkgLSAgSTJPIEV4ZWN1dGl2ZSByZXBseSBoYW5kbGVyCiAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSByZXBseSBjb21lcwogKglAbTogbWVzc2FnZSBpZAogKglAbXNnOiBwb2ludGVyIHRvIHRoZSBJMk8gcmVwbHkgbWVzc2FnZQogKgogKglUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gSWYgYSBQT1NUIFdBSVQKICoJcmVwbHkgd2FzIHJlY2VpdmVkLCBwYXNzIGl0IHRvIHRoZSBjb21wbGV0ZSBmdW5jdGlvbi4gSWYgYSBMQ1QgTk9USUZZCiAqCXJlcGx5IHdhcyByZWNlaXZlZCwgYSBuZXcgZXZlbnQgaXMgY3JlYXRlZCB0byBoYW5kbGUgdGhlIHVwZGF0ZS4KICoKICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgbm90IGJlIGZsdXNoZWQgb3IgPiAwCiAqCW9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgYmUgZmx1c2hlZC4gUmV0dXJucyBuZWdhdGl2ZSBlcnJvcgogKgljb2RlIG9uIGZhaWx1cmUgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgYmUgZmx1c2hlZC4KICovCnN0YXRpYyBpbnQgaTJvX2V4ZWNfcmVwbHkoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwKCQkJICBzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZykKewoJdTMyIGNvbnRleHQ7CgoJaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5oZWFkWzBdKSAmIE1TR19GQUlMKSB7CgkJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKnBtc2c7CgkJdTMyIHBtOwoKCQkvKgoJCSAqIElmIEZhaWwgYml0IGlzIHNldCB3ZSBtdXN0IHRha2UgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHQgb2YKCQkgKiB0aGUgcHJlc2VydmVkIG1lc3NhZ2UgdG8gZmluZCB0aGUgcmlnaHQgcmVxdWVzdCBhZ2Fpbi4KCQkgKi8KCgkJcG0gPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbM10pOwoJCXBtc2cgPSBpMm9fbXNnX2luX3RvX3ZpcnQoYywgcG0pOwoJCWNvbnRleHQgPSByZWFkbCgmcG1zZy0+dS5zLnRjbnR4dCk7CgoJCWkyb19yZXBvcnRfc3RhdHVzKEtFUk5fSU5GTywgImkyb19jb3JlIiwgbXNnKTsKCgkJLyogUmVsZWFzZSB0aGUgcHJlc2VydmVkIG1zZyAqLwoJCWkyb19tc2dfbm9wX21mYShjLCBwbSk7Cgl9IGVsc2UKCQljb250ZXh0ID0gbGUzMl90b19jcHUobXNnLT51LnMudGNudHh0KTsKCglpZiAoY29udGV4dCAmIDB4ODAwMDAwMDApCgkJcmV0dXJuIGkyb19tc2dfcG9zdF93YWl0X2NvbXBsZXRlKGMsIG0sIG1zZywgY29udGV4dCk7CgoJaWYgKChsZTMyX3RvX2NwdShtc2ctPnUuaGVhZFsxXSkgPj4gMjQpID09IEkyT19DTURfTENUX05PVElGWSkgewoJCXN0cnVjdCBpMm9fZXhlY19sY3Rfbm90aWZ5X3dvcmsgKndvcms7CgoJCXByX2RlYnVnKCIlczogTENUIG5vdGlmeSByZWNlaXZlZFxuIiwgYy0+bmFtZSk7CgoJCXdvcmsgPSBrbWFsbG9jKHNpemVvZigqd29yayksIEdGUF9BVE9NSUMpOwoJCWlmICghd29yaykKCQkJcmV0dXJuIC1FTk9NRU07CgoJCXdvcmstPmMgPSBjOwoKCQlJTklUX1dPUksoJndvcmstPndvcmssIGkyb19leGVjX2xjdF9tb2RpZmllZCk7CgkJcXVldWVfd29yayhpMm9fZXhlY19kcml2ZXIuZXZlbnRfcXVldWUsICZ3b3JrLT53b3JrKTsKCQlyZXR1cm4gMTsKCX0KCgkvKgoJICogSWYgdGhpcyBoYXBwZW5zLCB3ZSB3YW50IHRvIGR1bXAgdGhlIG1lc3NhZ2UgdG8gdGhlIHN5c2xvZyBzbwoJICogaXQgY2FuIGJlIHNlbnQgYmFjayB0byB0aGUgY2FyZCBtYW51ZmFjdHVyZXIgYnkgdGhlIGVuZCB1c2VyCgkgKiB0byBhaWQgaW4gZGVidWdnaW5nLgoJICoKCSAqLwoJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuc29saWNpdGVkIG1lc3NhZ2UgcmVwbHkgc2VudCB0byBjb3JlISIKCSAgICAgICAiTWVzc2FnZSBkdW1wZWQgdG8gc3lzbG9nXG4iLCBjLT5uYW1lKTsKCWkyb19kdW1wX21lc3NhZ2UobXNnKTsKCglyZXR1cm4gLUVGQVVMVDsKfQoKLyoqCiAqCWkyb19leGVjX2V2ZW50IC0gRXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24KICoJQHdvcms6IFdvcmsgaXRlbSBpbiBvY2N1cnJpbmcgZXZlbnQKICoKICoJSGFuZGxlcyBldmVudHMgc2VuZCBieSB0aGUgRXhlY3V0aXZlIGRldmljZS4gQXQgdGhlIG1vbWVudCBkb2VzIG5vdCBkbwogKglhbnl0aGluZyB1c2VmdWwuCiAqLwpzdGF0aWMgdm9pZCBpMm9fZXhlY19ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCnsKCXN0cnVjdCBpMm9fZXZlbnQgKmV2dCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaTJvX2V2ZW50LCB3b3JrKTsKCglpZiAobGlrZWx5KGV2dC0+aTJvX2RldikpCgkJb3NtX2RlYnVnKCJFdmVudCByZWNlaXZlZCBmcm9tIGRldmljZTogJWRcbiIsCgkJCSAgZXZ0LT5pMm9fZGV2LT5sY3RfZGF0YS50aWQpOwoJa2ZyZWUoZXZ0KTsKfTsKCi8qKgogKglpMm9fZXhlY19sY3RfZ2V0IC0gR2V0IHRoZSBJT1AncyBMb2dpY2FsIENvbmZpZ3VyYXRpb24gVGFibGUKICoJQGM6IEkyTyBjb250cm9sbGVyIGZyb20gd2hpY2ggdGhlIExDVCBzaG91bGQgYmUgZmV0Y2hlZAogKgogKglTZW5kIGEgTENUIE5PVElGWSByZXF1ZXN0IHRvIHRoZSBjb250cm9sbGVyLCBhbmQgd2FpdAogKglJMk9fVElNRU9VVF9MQ1RfR0VUIHNlY29uZHMgdW50aWwgYXJyaXZhbCBvZiByZXNwb25zZS4gSWYgdGhlIExDVCBpcwogKgl0byBsYXJnZSwgcmV0cnkgaXQuCiAqCiAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICovCmludCBpMm9fZXhlY19sY3RfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKewoJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CglpbnQgaSA9IDA7CglpbnQgcmMgPSAtRUFHQUlOOwoKCWZvciAoaSA9IDE7IGkgPD0gSTJPX0xDVF9HRVRfVFJJRVM7IGkrKykgewoJCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwoJCWlmIChJU19FUlIobXNnKSkKCQkJcmV0dXJuIFBUUl9FUlIobXNnKTsKCgkJbXNnLT51LmhlYWRbMF0gPQoJCSAgICBjcHVfdG9fbGUzMihFSUdIVF9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF82KTsKCQltc2ctPnUuaGVhZFsxXSA9CgkJICAgIGNwdV90b19sZTMyKEkyT19DTURfTENUX05PVElGWSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwKCQkJCUFEQVBURVJfVElEKTsKCQltc2ctPmJvZHlbMF0gPSBjcHVfdG9fbGUzMigweGZmZmZmZmZmKTsKCQltc2ctPmJvZHlbMV0gPSBjcHVfdG9fbGUzMigweDAwMDAwMDAwKTsKCQltc2ctPmJvZHlbMl0gPSBjcHVfdG9fbGUzMigweGQwMDAwMDAwIHwgYy0+ZGxjdC5sZW4pOwoJCW1zZy0+Ym9keVszXSA9IGNwdV90b19sZTMyKGMtPmRsY3QucGh5cyk7CgoJCXJjID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbXNnLCBJMk9fVElNRU9VVF9MQ1RfR0VUKTsKCQlpZiAocmMgPCAwKQoJCQlicmVhazsKCgkJcmMgPSBpMm9fZGV2aWNlX3BhcnNlX2xjdChjKTsKCQlpZiAocmMgIT0gLUVBR0FJTikKCQkJYnJlYWs7Cgl9CgoJcmV0dXJuIHJjOwp9CgovKioKICoJaTJvX2V4ZWNfbGN0X25vdGlmeSAtIFNlbmQgYSBhc3luY2hyb251cyBMQ1QgTk9USUZZIHJlcXVlc3QKICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IHNob3VsZCBiZSBzZW5kCiAqCUBjaGFuZ2VfaW5kOiBjaGFuZ2UgaW5kaWNhdG9yCiAqCiAqCVRoaXMgZnVuY3Rpb24gc2VuZHMgYSBMQ1QgTk9USUZZIHJlcXVlc3QgdG8gdGhlIEkyTyBjb250cm9sbGVyIHdpdGgKICoJdGhlIGNoYW5nZSBpbmRpY2F0b3IgY2hhbmdlX2luZC4gSWYgdGhlIGNoYW5nZV9pbmQgPT0gMCB0aGUgY29udHJvbGxlcgogKglyZXBsaWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSByZXF1ZXN0LiBJZiBjaGFuZ2VfaW5kID4gMCB0aGUgcmVwbHkgaXMKICoJc2VuZCBhZnRlciBjaGFuZ2UgaW5kaWNhdG9yIG9mIHRoZSBMQ1QgaXMgPiBjaGFuZ2VfaW5kLgogKi8Kc3RhdGljIGludCBpMm9fZXhlY19sY3Rfbm90aWZ5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIGNoYW5nZV9pbmQpCnsKCWkyb19zdGF0dXNfYmxvY2sgKnNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CglzdHJ1Y3QgZGV2aWNlICpkZXY7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKCglkb3duKCZjLT5sY3RfbG9jayk7CgoJZGV2ID0gJmMtPnBkZXYtPmRldjsKCglpZiAoaTJvX2RtYV9yZWFsbG9jCgkgICAgKGRldiwgJmMtPmRsY3QsIGxlMzJfdG9fY3B1KHNiLT5leHBlY3RlZF9sY3Rfc2l6ZSksIEdGUF9LRVJORUwpKQoJCXJldHVybiAtRU5PTUVNOwoKCW1zZyA9IGkyb19tc2dfZ2V0X3dhaXQoYywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwoJaWYgKElTX0VSUihtc2cpKQoJCXJldHVybiBQVFJfRVJSKG1zZyk7CgoJbXNnLT51LmhlYWRbMF0gPSBjcHVfdG9fbGUzMihFSUdIVF9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF82KTsKCW1zZy0+dS5oZWFkWzFdID0gY3B1X3RvX2xlMzIoSTJPX0NNRF9MQ1RfTk9USUZZIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfAoJCQkJICAgICBBREFQVEVSX1RJRCk7Cgltc2ctPnUucy5pY250eHQgPSBjcHVfdG9fbGUzMihpMm9fZXhlY19kcml2ZXIuY29udGV4dCk7Cgltc2ctPnUucy50Y250eHQgPSBjcHVfdG9fbGUzMigweDAwMDAwMDAwKTsKCW1zZy0+Ym9keVswXSA9IGNwdV90b19sZTMyKDB4ZmZmZmZmZmYpOwoJbXNnLT5ib2R5WzFdID0gY3B1X3RvX2xlMzIoY2hhbmdlX2luZCk7Cgltc2ctPmJvZHlbMl0gPSBjcHVfdG9fbGUzMigweGQwMDAwMDAwIHwgYy0+ZGxjdC5sZW4pOwoJbXNnLT5ib2R5WzNdID0gY3B1X3RvX2xlMzIoYy0+ZGxjdC5waHlzKTsKCglpMm9fbXNnX3Bvc3QoYywgbXNnKTsKCgl1cCgmYy0+bGN0X2xvY2spOwoKCXJldHVybiAwOwp9OwoKLyogRXhlYyBPU00gZHJpdmVyIHN0cnVjdCAqLwpzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fZXhlY19kcml2ZXIgPSB7CgkubmFtZSA9IE9TTV9OQU1FLAoJLnJlcGx5ID0gaTJvX2V4ZWNfcmVwbHksCgkuZXZlbnQgPSBpMm9fZXhlY19ldmVudCwKCS5jbGFzc2VzID0gaTJvX2V4ZWNfY2xhc3NfaWQsCgkuZHJpdmVyID0gewoJCSAgIC5wcm9iZSA9IGkyb19leGVjX3Byb2JlLAoJCSAgIC5yZW1vdmUgPSBpMm9fZXhlY19yZW1vdmUsCgkJICAgfSwKfTsKCi8qKgogKglpMm9fZXhlY19pbml0IC0gUmVnaXN0ZXJzIHRoZSBFeGVjIE9TTQogKgogKglSZWdpc3RlcnMgdGhlIEV4ZWMgT1NNIGluIHRoZSBJMk8gY29yZS4KICoKICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogKi8KaW50IF9faW5pdCBpMm9fZXhlY19pbml0KHZvaWQpCnsKCXJldHVybiBpMm9fZHJpdmVyX3JlZ2lzdGVyKCZpMm9fZXhlY19kcml2ZXIpOwp9OwoKLyoqCiAqCWkyb19leGVjX2V4aXQgLSBSZW1vdmVzIHRoZSBFeGVjIE9TTQogKgogKglVbnJlZ2lzdGVycyB0aGUgRXhlYyBPU00gZnJvbSB0aGUgSTJPIGNvcmUuCiAqLwp2b2lkIGkyb19leGVjX2V4aXQodm9pZCkKewoJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fZXhlY19kcml2ZXIpOwp9OwoKRVhQT1JUX1NZTUJPTChpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0pOwpFWFBPUlRfU1lNQk9MKGkyb19leGVjX2xjdF9nZXQpOwo=