LyoKICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDYKICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDYKICogREFWRSBTcmwgPHd3dy5kYXZlLXRlY2guaXQ+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA0CiAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxwcGM0eHguaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgInNkcmFtLmgiCgoKI2lmZGVmIENPTkZJR19TRFJBTV9CQU5LMAoKCiNpZm5kZWYgQ0ZHX1NEUkFNX1RBQkxFCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gewoJeygxMjggPDwgMjApLCAxMywgMHgwMDBBNDAwMX0sICAgICAgLyogKDAtMTI4TUIpIEFkZHJlc3MgTW9kZSAzLCAxM3gxMCg0KSAqLwoJeyg2NCA8PCAyMCksICAxMywgMHgwMDA4NDAwMX0sICAgICAgLyogKDAtNjRNQikgQWRkcmVzcyBNb2RlIDMsIDEzeDkoNCkgICAqLwoJeygzMiA8PCAyMCksICAxMiwgMHgwMDA2MjAwMX0sICAgICAgLyogKDAtMzJNQikgQWRkcmVzcyBNb2RlIDIsIDEyeDkoNCkgICAqLwoJeygxNiA8PCAyMCksICAxMiwgMHgwMDA0NjAwMX0sICAgICAgLyogKDAtMTZNQikgQWRkcmVzcyBNb2RlIDQsIDEyeDgoNCkgICAqLwoJeyg0IDw8IDIwKSwgICAxMSwgMHgwMDAwODAwMX0sICAgICAgLyogKDAtNE1CKSBBZGRyZXNzIE1vZGUgNSwgMTF4OCgyKSAgICAqLwp9OwojZWxzZQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IENGR19TRFJBTV9UQUJMRTsKI2VuZGlmCgojZGVmaW5lCU5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQoKCiNpZm5kZWYgQ09ORklHXzQ0MAoKI2lmZGVmIENGR19TRFJBTV9DQVNMCnN0YXRpYyB1bG9uZyBuczJjbGtzKHVsb25nIG5zKQp7Cgl1bG9uZyBidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChnZXRfYnVzX2ZyZXEoMCkgLyAxMCk7CgoJcmV0dXJuICgobnMgKiAxMCkgKyBidXNfcGVyaW9kX3hfMTApIC8gYnVzX3BlcmlvZF94XzEwOwp9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoKc3RhdGljIHVsb25nIGNvbXB1dGVfc2R0cjEodWxvbmcgc3BlZWQpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCiAgICAgICAgdWxvbmcgdG1wOwogICAgICAgIHVsb25nIHNkdHIxID0gMDsKCiAgICAgICAgLyogQ0FTTCAqLwogICAgICAgIGlmIChDRkdfU0RSQU1fQ0FTTCA8IDIpCiAgICAgICAgICAgICAgICBzZHRyMSB8PSAoMSA8PCBTRFJBTTBfVFJfQ0FTTCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgaWYgKENGR19TRFJBTV9DQVNMID4gNCkKICAgICAgICAgICAgICAgICAgICAgICAgc2R0cjEgfD0gKDMgPDwgU0RSQU0wX1RSX0NBU0wpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzZHRyMSB8PSAoKENGR19TRFJBTV9DQVNMLTEpIDw8IFNEUkFNMF9UUl9DQVNMKTsKCiAgICAgICAgLyogUFRBICovCiAgICAgICAgdG1wID0gbnMyY2xrcyhDRkdfU0RSQU1fUFRBKTsKICAgICAgICBpZiAoKHRtcCA+PSAyKSAmJiAodG1wIDw9IDQpKQogICAgICAgICAgICAgICAgc2R0cjEgfD0gKCh0bXAtMSkgPDwgU0RSQU0wX1RSX1BUQSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgc2R0cjEgfD0gKCg0LTEpIDw8IFNEUkFNMF9UUl9QVEEpOwoKICAgICAgICAvKiBDVFAgKi8KICAgICAgICB0bXAgPSBuczJjbGtzKENGR19TRFJBTV9DVFApOwogICAgICAgIGlmICgodG1wID49IDIpICYmICh0bXAgPD0gNCkpCiAgICAgICAgICAgICAgICBzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfQ1RQKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX0NUUCk7CgogICAgICAgIC8qIExERiAqLwogICAgICAgIHRtcCA9IG5zMmNsa3MoQ0ZHX1NEUkFNX0xERik7CiAgICAgICAgaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKICAgICAgICAgICAgICAgIHNkdHIxIHw9ICgodG1wLTEpIDw8IFNEUkFNMF9UUl9MREYpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNkdHIxIHw9ICgoMi0xKSA8PCBTRFJBTTBfVFJfTERGKTsKCiAgICAgICAgLyogUkZUQSAqLwogICAgICAgIHRtcCA9IG5zMmNsa3MoQ0ZHX1NEUkFNX1JGVEEpOwogICAgICAgIGlmICgodG1wID49IDQpICYmICh0bXAgPD0gMTApKQogICAgICAgICAgICAgICAgc2R0cjEgfD0gKCh0bXAtNCkgPDwgU0RSQU0wX1RSX1JGVEEpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHNkdHIxIHw9ICgoMTAtNCkgPDwgU0RSQU0wX1RSX1JGVEEpOwoKICAgICAgICAvKiBSQ0QgKi8KICAgICAgICB0bXAgPSBuczJjbGtzKENGR19TRFJBTV9SQ0QpOwogICAgICAgIGlmICgodG1wID49IDIpICYmICh0bXAgPD0gNCkpCiAgICAgICAgICAgICAgICBzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUkNEKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1JDRCk7CgogICAgICAgIHJldHVybiBzZHRyMTsKI2Vsc2UgLyogQ0ZHX1NEUkFNX0NBU0wgKi8KICAgICAgICAvKgogICAgICAgICAqIElmIG5vIHZhbHVlcyBhcmUgY29uZmlndXJlZCBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUKICAgICAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzLCB3aGljaCBzZWVtIHRvIGJlIG9rIGZvciBtb3N0CiAgICAgICAgICogYm9hcmRzLgogICAgICAgICAqCiAgICAgICAgICogUkVNQVJLOgogICAgICAgICAqIEZvciBuZXcgYm9hcmQgcG9ydHMgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIGRlZmluZSB0aGUKICAgICAgICAgKiBjb3JyZWN0IHZhbHVlcyBmb3IgdGhlIHVzZWQgU0RSQU0gY2hpcHMgaW4geW91ciBib2FyZAogICAgICAgICAqIGNvbmZpZyBmaWxlIChzZWUgUFBDaGFtZWxlb25FVkIuaCkKICAgICAgICAgKi8KICAgICAgICBpZiAoc3BlZWQgPiAxMDAwMDAwMDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAxMzMgTUh6IFNEUkFNCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiAweDAxMDc0MDE1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZGVmYXVsdDogMTAwIE1IeiBTRFJBTQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZXR1cm4gMHgwMDg2NDAwZDsKICAgICAgICB9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwp9CgovKiByZWZyZXNoIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwpzdGF0aWMgdWxvbmcgY29tcHV0ZV9ydHIodWxvbmcgc3BlZWQsIHVsb25nIHJvd3MsIHVsb25nIHJlZnJlc2gpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCiAgICAgICAgdWxvbmcgdG1wOwoKICAgICAgICB0bXAgPSAoKHJlZnJlc2gqMTAwMCoxMDAwKSAvICgxIDw8IHJvd3MpKSAqIChzcGVlZCAvIDEwMDApOwogICAgICAgIHRtcCAvPSAxMDAwMDAwOwoKICAgICAgICByZXR1cm4gKCh0bXAgJiAweDAwMDAzRkY4KSA8PCAxNik7CiNlbHNlIC8qIENGR19TRFJBTV9DQVNMICovCiAgICAgICAgaWYgKHNwZWVkID4gMTAwMDAwMDAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogMTMzIE1IeiBTRFJBTQogICAgICAgICAgICAgICAgICovCgkJcmV0dXJuIDB4MDdmMDAwMDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBkZWZhdWx0OiAxMDAgTUh6IFNEUkFNCiAgICAgICAgICAgICAgICAgKi8KCQlyZXR1cm4gMHgwNWYwMDAwMDsKICAgICAgICB9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwp9CgovKgogKiBBdXRvZGV0ZWN0IG9uYm9hcmQgU0RSQU0gb24gNDA1IHBsYXRmb3JtcwogKi8Kdm9pZCBzZHJhbV9pbml0KHZvaWQpCnsKCXVsb25nIHNwZWVkOwoJdWxvbmcgc2R0cjE7CglpbnQgaTsKCiAgICAgICAgLyoKICAgICAgICAgKiBEZXRlcm1pbmUgU0RSQU0gc3BlZWQKICAgICAgICAgKi8KICAgICAgICBzcGVlZCA9IGdldF9idXNfZnJlcSgwKTsgLyogcGFyYW1ldGVyIG5vdCB1c2VkIG9uIHBwYzR4eCAqLwoKICAgICAgICAvKgogICAgICAgICAqIHNkdHIxIChyZWdpc3RlciBTRFJBTTBfVFIpIG11c3QgdGFrZSBpbnRvIGFjY291bnQgdGltaW5ncyBsaXN0ZWQKICAgICAgICAgKiBpbiBTRFJBTSBjaGlwIGRhdGFzaGVldC4gcnRyIChyZWdpc3RlciBTRFJBTTBfUlRSKSBtdXN0IHRha2UgaW50bwogICAgICAgICAqIGFjY291bnQgYWN0dWFsIFNEUkFNIHNpemUuIFNvIHdlIGNhbiBzZXQgdXAgc2R0cjEgYWNjb3JkaW5nIHRvIHdoYXQKICAgICAgICAgKiBpcyBzcGVjaWZpZWQgaW4gYm9hcmQgY29uZmlndXJhdGlvbiBmaWxlIHdoaWxlIHJ0ciBkZXBlbmRkcyBvbiBTRFJBTQogICAgICAgICAqIHNpemUgd2UgYXJlIGFzc3VtaW5nIGJlZm9yZSBkZXRlY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgc2R0cjEgPSBjb21wdXRlX3NkdHIxKHNwZWVkKTsKCglmb3IgKGk9MDsgaTxOX01CMENGOyBpKyspIHsKCQkvKgoJCSAqIERpc2FibGUgbWVtb3J5IGNvbnRyb2xsZXIuCgkJICovCgkJbXRzZHJhbTAobWVtX21jb3B0MSwgMHgwMDAwMDAwMCk7CgoJCS8qCgkJICogU2V0IE1CMENGIGZvciBiYW5rIDAuCgkJICovCgkJbXRzZHJhbTAobWVtX21iMGNmLCBtYjBjZltpXS5yZWcpOwoJCW10c2RyYW0wKG1lbV9zZHRyMSwgc2R0cjEpOwoJCW10c2RyYW0wKG1lbV9ydHIsIGNvbXB1dGVfcnRyKHNwZWVkLCBtYjBjZltpXS5yb3dzLCA2NCkpOwoKCQl1ZGVsYXkoMjAwKTsKCgkJLyoKCQkgKiBTZXQgbWVtb3J5IGNvbnRyb2xsZXIgb3B0aW9ucyByZWcsIE1DT1BUMS4KCQkgKiBTZXQgRENfRU4gdG8gJzEnIGFuZCBCUkRfUFJGIHRvICcwMScgZm9yIDE2IGJ5dGUgUExCIEJ1cnN0CgkJICogcmVhZC9wcmVmZXRjaC4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWNvcHQxLCAweDgwODAwMDAwKTsKCgkJdWRlbGF5KDEwMDAwKTsKCgkJaWYgKGdldF9yYW1fc2l6ZSgwLCBtYjBjZltpXS5zaXplKSA9PSBtYjBjZltpXS5zaXplKSB7CgkJCS8qCgkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCgkJCSAqLwoJCQlyZXR1cm47CgkJfQoJfQp9CgojZWxzZSAvKiBDT05GSUdfNDQwICovCgojZGVmaW5lIE5VTV9UUklFUyA2NAojZGVmaW5lIE5VTV9SRUFEUyAxMAoKc3RhdGljIHZvaWQgc2RyYW1fdHIxX3NldChpbnQgcmFtX2FkZHJlc3MsIGludCogdHIxX3ZhbHVlKQp7CglpbnQgaTsKCWludCBqLCBrOwoJdm9sYXRpbGUgdW5zaWduZWQgaW50KiByYW1fcG9pbnRlciA9ICh1bnNpZ25lZCBpbnQgKilyYW1fYWRkcmVzczsKCWludCBmaXJzdF9nb29kID0gLTEsIGxhc3RfYmFkID0gMHgxZmY7CgoJdW5zaWduZWQgbG9uZyB0ZXN0W05VTV9UUklFU10gPSB7CgkJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKCQkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAoJCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCgkJMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAoJCTB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsIDB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsCgkJMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwKCQkweDU1NTU1NTU1LCAweDU1NTU1NTU1LCAweEFBQUFBQUFBLCAweEFBQUFBQUFBLAoJCTB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsCgkJMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwgMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwKCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAoJCTB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsIDB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsCgkJMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwKCQkweEFBNTVBQTU1LCAweEFBNTVBQTU1LCAweDU1QUE1NUFBLCAweDU1QUE1NUFBLAoJCTB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsCgkJMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwgMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSB9OwoKCS8qIGdvIHRocm91Z2ggYWxsIHBvc3NpYmxlIFNEUkFNMF9UUjFbUkRDVF0gdmFsdWVzICovCglmb3IgKGk9MDsgaTw9MHgxZmY7IGkrKykgewoJCS8qIHNldCB0aGUgY3VycmVudCB2YWx1ZSBmb3IgVFIxICovCgkJbXRzZHJhbShtZW1fdHIxLCAoMHg4MDgwMDgwMCB8IGkpKTsKCgkJLyogd3JpdGUgdmFsdWVzICovCgkJZm9yIChqPTA7IGo8TlVNX1RSSUVTOyBqKyspIHsKCQkJcmFtX3BvaW50ZXJbal0gPSB0ZXN0W2pdOwoKCQkJLyogY2xlYXIgYW55IGNhY2hlIGF0IHJhbSBsb2NhdGlvbiAqLwoJCQlfX2FzbV9fKCJkY2JmIDAsJTAiOiA6InIiICgmcmFtX3BvaW50ZXJbal0pKTsKCQl9CgoJCS8qIHJlYWQgdmFsdWVzIGJhY2sgKi8KCQlmb3IgKGo9MDsgajxOVU1fVFJJRVM7IGorKykgewoJCQlmb3IgKGs9MDsgazxOVU1fUkVBRFM7IGsrKykgewoJCQkJLyogY2xlYXIgYW55IGNhY2hlIGF0IHJhbSBsb2NhdGlvbiAqLwoJCQkJX19hc21fXygiZGNiZiAwLCUwIjogOiJyIiAoJnJhbV9wb2ludGVyW2pdKSk7CgoJCQkJaWYgKHJhbV9wb2ludGVyW2pdICE9IHRlc3Rbal0pCgkJCQkJYnJlYWs7CgkJCX0KCgkJCS8qIHJlYWQgZXJyb3IgKi8KCQkJaWYgKGsgIT0gTlVNX1JFQURTKQoJCQkJYnJlYWs7CgkJfQoKCQkvKiB3ZSBoYXZlIGEgU0RSQU0wX1RSMVtSRENUXSB0aGF0IGlzIHBhcnQgb2YgdGhlIHdpbmRvdyAqLwoJCWlmIChqID09IE5VTV9UUklFUykgewoJCQlpZiAoZmlyc3RfZ29vZCA9PSAtMSkKCQkJCWZpcnN0X2dvb2QgPSBpOwkJLyogZm91bmQgYmVnaW5uaW5nIG9mIHdpbmRvdyAqLwoJCX0gZWxzZSB7IC8qIGJhZCByZWFkICovCgkJCS8qIGlmIHdlIGhhdmUgbm90IGhhZCBhIGdvb2QgcmVhZCB0aGVuIGRvbid0IGNhcmUgKi8KCQkJaWYgKGZpcnN0X2dvb2QgIT0gLTEpIHsKCQkJCS8qIGZpcnN0IGZhaWx1cmUgYWZ0ZXIgYSBnb29kIHJlYWQgKi8KCQkJCWxhc3RfYmFkID0gaS0xOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CgoJLyogcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZvciBUUjEgKi8KCSp0cjFfdmFsdWUgPSAoZmlyc3RfZ29vZCArIGxhc3RfYmFkKSAvIDI7Cn0KCgojaWZkZWYgQ09ORklHX1NEUkFNX0VDQwpzdGF0aWMgdm9pZCBlY2NfaW5pdCh1bG9uZyBzdGFydCwgdWxvbmcgc2l6ZSkKewoJdWxvbmcJY3VycmVudF9hZGRyOwkJLyogY3VycmVudCBieXRlIGFkZHJlc3MgKi8KCXVsb25nCWVuZF9hZGRyOwkJLyogZW5kIG9mIG1lbW9yeSByZWdpb24gKi8KCXVsb25nCWFkZHJfaW5jOwkJLyogYWRkcmVzcyBza2lwIGJldHdlZW4gd3JpdGVzICovCgl1bG9uZwljZmcwX3JlZzsJCS8qIGZvciByZXN0b3JpbmcgRUNDIHN0YXRlICovCgoJLyoKCSAqIFRPRE86IEVuYWJsZSBkY2FjaGUgYmVmb3JlIHJ1bm5pbmcgdGhpcyB0ZXN0IChzcGVlZHVwKQoJICovCgoJbWZzZHJhbShtZW1fY2ZnMCwgY2ZnMF9yZWcpOwoJbXRzZHJhbShtZW1fY2ZnMCwgKGNmZzBfcmVnICYgflNEUkFNX0NGRzBfTUVNQ0hLKSB8IFNEUkFNX0NGRzBfTUVNQ0hLX0dFTik7CgoJLyoKCSAqIGxvb2sgYXQgZ2VvbWV0cnkgb2YgU0RSQU0gKGRhdGEgd2lkdGgpIHRvIGRldGVybWluZSB3aGV0aGVyIHdlCgkgKiBjYW4gc2tpcCB3b3JkcyB3aGVuIHdyaXRpbmcKCSAqLwoJaWYgKChjZmcwX3JlZyAmIFNEUkFNX0NGRzBfRFJBTVdEVEgpID09IFNEUkFNX0NGRzBfRFJBTVdEVEhfMzIpCgkJYWRkcl9pbmMgPSA0OwoJZWxzZQoJCWFkZHJfaW5jID0gODsKCgljdXJyZW50X2FkZHIgPSBzdGFydDsKCWVuZF9hZGRyID0gc3RhcnQgKyBzaXplOwoKCXdoaWxlIChjdXJyZW50X2FkZHIgPCBlbmRfYWRkcikgewoJCSooKHVsb25nICopY3VycmVudF9hZGRyKSA9IDB4MDAwMDAwMDA7CgkJY3VycmVudF9hZGRyICs9IGFkZHJfaW5jOwoJfQoKCS8qCgkgKiBUT0RPOiBGbHVzaCBkY2FjaGUgYW5kIGRpc2FibGUgaXQgYWdhaW4KCSAqLwoKCS8qCgkgKiBFbmFibGUgZWNjIGNoZWNraW5nIGFuZCBwYXJpdHkgZXJyb3JzCgkgKi8KCW10c2RyYW0obWVtX2NmZzAsIChjZmcwX3JlZyAmIH5TRFJBTV9DRkcwX01FTUNISykgfCBTRFJBTV9DRkcwX01FTUNIS19DSEspOwp9CiNlbmRpZgoKLyoKICogQXV0b2RldGVjdCBvbmJvYXJkIEREUiBTRFJBTSBvbiA0NDAgcGxhdGZvcm1zCiAqCiAqIE5PVEU6IFNvbWUgb2YgdGhlIGhhcmRjb2RlZCB2YWx1ZXMgYXJlIGhhcmR3YXJlIGRlcGVuZGFudCwKICogICAgICAgc28gdGhpcyBzaG91bGQgYmUgZXh0ZW5kZWQgZm9yIG90aGVyIGZ1dHVyZSBib2FyZHMKICogICAgICAgdXNpbmcgdGhpcyByb3V0aW5lIQogKi8KbG9uZyBpbnQgaW5pdGRyYW0oaW50IGJvYXJkX3R5cGUpCnsKCWludCBpOwoJaW50IHRyMV9iYW5rMTsKCglmb3IgKGk9MDsgaTxOX01CMENGOyBpKyspIHsKCQkvKgoJCSAqIERpc2FibGUgbWVtb3J5IGNvbnRyb2xsZXIuCgkJICovCgkJbXRzZHJhbShtZW1fY2ZnMCwgMHgwMDAwMDAwMCk7CgoJCS8qCgkJICogU2V0dXAgc29tZSBkZWZhdWx0CgkJICovCgkJbXRzZHJhbShtZW1fdWFiYmEsIDB4MDAwMDAwMDApOwkvKiB1YmJhPTAgKGRlZmF1bHQpICAgICAgICAgICAgICovCgkJbXRzZHJhbShtZW1fc2xpbywgMHgwMDAwMDAwMCk7CS8qIHJkcmU9MCB3cnJlPTAgcmFydz0wICAgICAgICAgKi8KCQltdHNkcmFtKG1lbV9kZXZvcHQsIDB4MDAwMDAwMDApOyAvKiBkbGw9MCBkcz0wIChub3JtYWwpCQkqLwoJCW10c2RyYW0obWVtX3dkZGN0ciwgMHgwMDAwMDAwMCk7IC8qIHdyY3A9MCBkY2Q9MAkJKi8KCQltdHNkcmFtKG1lbV9jbGt0ciwgMHg0MDAwMDAwMCk7CS8qIGNsa3A9MSAoOTAgZGVnIHdyKSBkY2R0PTAgICAgKi8KCgkJLyoKCQkgKiBGb2xsb3dpbmcgZm9yIENBUyBMYXRlbmN5ID0gMi41IEAgMTMzIE1IeiBQTEIKCQkgKi8KCQltdHNkcmFtKG1lbV9iMGNyLCBtYjBjZltpXS5yZWcpOwoJCW10c2RyYW0obWVtX3RyMCwgMHg0MTA5NDAxMik7CgkJbXRzZHJhbShtZW1fdHIxLCAweDgwODAwODAwKTsJLyogU1M9VDIgU0w9U1RBR0UgMyBDRD0xIENUPTB4MDAqLwoJCW10c2RyYW0obWVtX3J0ciwgMHg3ZTAwMDAwMCk7CS8qIEludGVydmFsIDE1LjIwtXMgQCAxMzNNSHogUExCKi8KCQltdHNkcmFtKG1lbV9jZmcxLCAweDAwMDAwMDAwKTsJLyogU2VsZi1yZWZyZXNoIGV4aXQsIGRpc2FibGUgUE0qLwoJCXVkZWxheSg0MDApOwkJCS8qIERlbGF5IDIwMCB1c2VjcyAobWluKQkqLwoKCQkvKgoJCSAqIEVuYWJsZSB0aGUgY29udHJvbGxlciwgdGhlbiB3YWl0IGZvciBEQ0VOIHRvIGNvbXBsZXRlCgkJICovCgkJbXRzZHJhbShtZW1fY2ZnMCwgMHg4NjAwMDAwMCk7CS8qIERDRU49MSwgUE1VRD0xLCA2NC1iaXQgICAgICAgKi8KCQl1ZGVsYXkoMTAwMDApOwoKCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKCQkJLyoKCQkJICogT3B0aW1pemUgVFIxIHRvIGN1cnJlbnQgaGFyZHdhcmUgZW52aXJvbm1lbnQKCQkJICovCgkJCXNkcmFtX3RyMV9zZXQoMHgwMDAwMDAwMCwgJnRyMV9iYW5rMSk7CgkJCW10c2RyYW0obWVtX3RyMSwgKHRyMV9iYW5rMSB8IDB4ODA4MDA4MDApKTsKCiNpZmRlZiBDT05GSUdfU0RSQU1fRUNDCgkJCWVjY19pbml0KDAsIG1iMGNmW2ldLnNpemUpOwojZW5kaWYKCgkJCS8qCgkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCgkJCSAqLwoJCQlyZXR1cm4gbWIwY2ZbaV0uc2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIDA7CQkJCS8qIG5vdGhpbmcgZm91bmQgIQkJKi8KfQoKI2VuZGlmIC8qIENPTkZJR180NDAgKi8KCiNlbmRpZiAvKiBDT05GSUdfU0RSQU1fQkFOSzAgKi8K