LyoKICogY2kxM3h4eF91ZGMuYyAtIE1JUFMgVVNCIElQIGNvcmUgZmFtaWx5IGRldmljZSBjb250cm9sbGVyCiAqCiAqIENvcHlyaWdodCAoQykgMjAwOCBDaGlwaWRlYSAtIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIEF1dGhvcjogRGF2aWQgTG9wbwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICovCgovKgogKiBEZXNjcmlwdGlvbjogTUlQUyBVU0IgSVAgY29yZSBmYW1pbHkgZGV2aWNlIGNvbnRyb2xsZXIKICogICAgICAgICAgICAgIEN1cnJlbnRseSBpdCBvbmx5IHN1cHBvcnRzIElQIHBhcnQgbnVtYmVyIENJMTM0MTIKICoKICogVGhpcyBkcml2ZXIgaXMgY29tcG9zZWQgb2Ygc2V2ZXJhbCBibG9ja3M6CiAqIC0gSFc6ICAgICBoYXJkd2FyZSBpbnRlcmZhY2UKICogLSBEQkc6ICAgIGRlYnVnIGZhY2lsaXRpZXMgKG9wdGlvbmFsKQogKiAtIFVUSUw6ICAgdXRpbGl0aWVzCiAqIC0gSVNSOiAgICBpbnRlcnJ1cHRzIGhhbmRsaW5nCiAqIC0gRU5EUFQ6ICBlbmRwb2ludCBvcGVyYXRpb25zIChHYWRnZXQgQVBJKQogKiAtIEdBREdFVDogZ2FkZ2V0IG9wZXJhdGlvbnMgKEdhZGdldCBBUEkpCiAqIC0gQlVTOiAgICBidXMgZ2x1ZSBjb2RlLCBidXMgYWJzdHJhY3Rpb24gbGF5ZXIKICogLSBQQ0k6ICAgIFBDSSBjb3JlIGludGVyZmFjZSBhbmQgUENJIHJlc291cmNlcyAoaW50ZXJydXB0cywgbWVtb3J5Li4uKQogKgogKiBDb21waWxlIE9wdGlvbnMKICogLSBDT05GSUdfVVNCX0dBREdFVF9ERUJVR19GSUxFUzogZW5hYmxlIGRlYnVnIGZhY2lsaXRpZXMKICogLSBTVEFMTF9JTjogIG5vbi1lbXB0eSBidWxrLWluIHBpcGVzIGNhbm5vdCBiZSBoYWx0ZWQKICogICAgICAgICAgICAgIGlmIGRlZmluZWQgbWFzcyBzdG9yYWdlIGNvbXBsaWFuY2Ugc3VjY2VlZHMgYnV0IHdpdGggd2FybmluZ3MKICogICAgICAgICAgICAgID0+IGNhc2UgNDogSGkgPiAgRG4KICogICAgICAgICAgICAgID0+IGNhc2UgNTogSGkgPiAgRGkKICogICAgICAgICAgICAgID0+IGNhc2UgODogSGkgPD4gRG8KICogICAgICAgICAgICAgIGlmIHVuZGVmaW5lZCB1c2J0ZXN0IDEzIGZhaWxzCiAqIC0gVFJBQ0U6ICAgICBlbmFibGUgZnVuY3Rpb24gdHJhY2luZyAoZGVwZW5kcyBvbiBERUJVRykKICoKICogTWFpbiBGZWF0dXJlcwogKiAtIENoYXB0ZXIgOSAmIE1hc3MgU3RvcmFnZSBDb21wbGlhbmNlIHdpdGggR2FkZ2V0IEZpbGUgU3RvcmFnZQogKiAtIENoYXB0ZXIgOSBDb21wbGlhbmNlIHdpdGggR2FkZ2V0IFplcm8gKFNUQUxMX0lOIHVuZGVmaW5lZCkKICogLSBOb3JtYWwgJiBMUE0gc3VwcG9ydAogKgogKiBVU0JURVNUIFJlcG9ydAogKiAtIE9LOiAwLTEyLCAxMyAoU1RBTExfSU4gZGVmaW5lZCkgJiAxNAogKiAtIE5vdCBTdXBwb3J0ZWQ6IDE1ICYgMTYgKElTTykKICoKICogVE9ETyBMaXN0CiAqIC0gT1RHCiAqIC0gSXNvY2hyb25vdXMgJiBJbnRlcnJ1cHQgVHJhZmZpYwogKiAtIEhhbmRsZSByZXF1ZXN0cyB3aGljaCBzcGF3bnMgaW50byBzZXZlcmFsIFREcwogKiAtIEdFVF9TVEFUVVMoZGV2aWNlKSAtIGFsd2F5cyByZXBvcnRzIDAKICogLSBHYWRnZXQgQVBJIChtYWpvcml0eSBvZiBvcHRpb25hbCBmZWF0dXJlcykKICogLSBTdXNwZW5kICYgUmVtb3RlIFdha2V1cAogKi8KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiNpbmNsdWRlIDxsaW51eC9pcnEuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KCiNpbmNsdWRlICJjaTEzeHh4X3VkYy5oIgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogREVGSU5FCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogY3RybCByZWdpc3RlciBiYW5rIGFjY2VzcyAqLwpzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVkY19sb2NrKTsKCi8qIGRyaXZlciBuYW1lICovCiNkZWZpbmUgVURDX0RSSVZFUl9OQU1FICAgImNpMTN4eHhfdWRjIgoKLyogY29udHJvbCBlbmRwb2ludCBkZXNjcmlwdGlvbiAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCmN0cmxfZW5kcHRfZGVzYyA9IHsKCS5iTGVuZ3RoICAgICAgICAgPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKCS5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfRU5EUE9JTlQsCgoJLmJtQXR0cmlidXRlcyAgICA9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wsCgkud01heFBhY2tldFNpemUgID0gY3B1X3RvX2xlMTYoQ1RSTF9QQVlMT0FEX01BWCksCn07CgovKiBVREMgZGVzY3JpcHRvciAqLwpzdGF0aWMgc3RydWN0IGNpMTN4eHggKl91ZGM7CgovKiBJbnRlcnJ1cHQgc3RhdGlzdGljcyAqLwojZGVmaW5lIElTUl9NQVNLICAgMHgxRgpzdGF0aWMgc3RydWN0IHsKCXUzMiB0ZXN0OwoJdTMyIHVpOwoJdTMyIHVlaTsKCXUzMiBwY2k7Cgl1MzIgdXJpOwoJdTMyIHNsaTsKCXUzMiBub25lOwoJc3RydWN0IHsKCQl1MzIgY250OwoJCXUzMiBidWZbSVNSX01BU0srMV07CgkJdTMyIGlkeDsKCX0gaG5kbDsKfSBpc3Jfc3RhdGlzdGljczsKCi8qKgogKiBmZnNfbnI6IGZpbmQgZmlyc3QgKGxlYXN0IHNpZ25pZmljYW50KSBiaXQgc2V0CiAqIEB4OiB0aGUgd29yZCB0byBzZWFyY2gKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGJpdCBudW1iZXIgKGluc3RlYWQgb2YgcG9zaXRpb24pCiAqLwpzdGF0aWMgaW50IGZmc19ucih1MzIgeCkKewoJaW50IG4gPSBmZnMoeCk7CgoJcmV0dXJuIG4gPyBuLTEgOiAzMjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBIVyBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIHJlZ2lzdGVyIGJhbmsgZGVzY3JpcHRvciAqLwpzdGF0aWMgc3RydWN0IHsKCXVuc2lnbmVkICAgICAgbHBtOyAgICAvKiBpcyBMUE0/ICovCgl2b2lkIF9faW9tZW0gKmFiczsgICAgLyogYnVzIG1hcCBvZmZzZXQgKi8KCXZvaWQgX19pb21lbSAqY2FwOyAgICAvKiBidXMgbWFwIG9mZnNldCArIENBUCBvZmZzZXQgKyBDQVAgZGF0YSAqLwoJc2l6ZV90ICAgICAgICBzaXplOyAgIC8qIGJhbmsgc2l6ZSAqLwp9IGh3X2Jhbms7CgovKiBVREMgcmVnaXN0ZXIgbWFwICovCiNkZWZpbmUgQUJTX0NBUExFTkdUSCAgICAgICAoMHgxMDBVTCkKI2RlZmluZSBBQlNfSENDUEFSQU1TICAgICAgICgweDEwOFVMKQojZGVmaW5lIEFCU19EQ0NQQVJBTVMgICAgICAgKDB4MTI0VUwpCiNkZWZpbmUgQUJTX1RFU1RNT0RFICAgICAgICAoaHdfYmFuay5scG0gPyAweDBGQ1VMIDogMHgxMzhVTCkKLyogb2Zmc2V0IHRvIENBUExFTlRHSCAoYWRkciArIGRhdGEpICovCiNkZWZpbmUgQ0FQX1VTQkNNRCAgICAgICAgICAoMHgwMDBVTCkKI2RlZmluZSBDQVBfVVNCU1RTICAgICAgICAgICgweDAwNFVMKQojZGVmaW5lIENBUF9VU0JJTlRSICAgICAgICAgKDB4MDA4VUwpCiNkZWZpbmUgQ0FQX0RFVklDRUFERFIgICAgICAoMHgwMTRVTCkKI2RlZmluZSBDQVBfRU5EUFRMSVNUQUREUiAgICgweDAxOFVMKQojZGVmaW5lIENBUF9QT1JUU0MgICAgICAgICAgKDB4MDQ0VUwpCiNkZWZpbmUgQ0FQX0RFVkxDICAgICAgICAgICAoMHgwODRVTCkKI2RlZmluZSBDQVBfVVNCTU9ERSAgICAgICAgIChod19iYW5rLmxwbSA/IDB4MEM4VUwgOiAweDA2OFVMKQojZGVmaW5lIENBUF9FTkRQVFNFVFVQU1RBVCAgKGh3X2JhbmsubHBtID8gMHgwRDhVTCA6IDB4MDZDVUwpCiNkZWZpbmUgQ0FQX0VORFBUUFJJTUUgICAgICAoaHdfYmFuay5scG0gPyAweDBEQ1VMIDogMHgwNzBVTCkKI2RlZmluZSBDQVBfRU5EUFRGTFVTSCAgICAgIChod19iYW5rLmxwbSA/IDB4MEUwVUwgOiAweDA3NFVMKQojZGVmaW5lIENBUF9FTkRQVFNUQVQgICAgICAgKGh3X2JhbmsubHBtID8gMHgwRTRVTCA6IDB4MDc4VUwpCiNkZWZpbmUgQ0FQX0VORFBUQ09NUExFVEUgICAoaHdfYmFuay5scG0gPyAweDBFOFVMIDogMHgwN0NVTCkKI2RlZmluZSBDQVBfRU5EUFRDVFJMICAgICAgIChod19iYW5rLmxwbSA/IDB4MEVDVUwgOiAweDA4MFVMKQojZGVmaW5lIENBUF9MQVNUICAgICAgICAgICAgKGh3X2JhbmsubHBtID8gMHgxMkNVTCA6IDB4MEMwVUwpCgovKiBtYXhpbXVtIG51bWJlciBvZiBlbnBvaW50czogdmFsaWQgb25seSBhZnRlciBod19kZXZpY2VfcmVzZXQoKSAqLwpzdGF0aWMgdW5zaWduZWQgaHdfZXBfbWF4OwoKLyoqCiAqIGh3X2VwX2JpdDogY2FsY3VsYXRlcyB0aGUgYml0IG51bWJlcgogKiBAbnVtOiBlbmRwb2ludCBudW1iZXIKICogQGRpcjogZW5kcG9pbnQgZGlyZWN0aW9uCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBiaXQgbnVtYmVyCiAqLwpzdGF0aWMgaW5saW5lIGludCBod19lcF9iaXQoaW50IG51bSwgaW50IGRpcikKewoJcmV0dXJuIG51bSArIChkaXIgPyAxNiA6IDApOwp9CgovKioKICogaHdfYXJlYWQ6IHJlYWRzIGZyb20gcmVnaXN0ZXIgYml0ZmllbGQKICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gYnVzIG1hcAogKiBAbWFzazogYml0ZmllbGQgbWFzawogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcmVnaXN0ZXIgYml0ZmllbGQgZGF0YQogKi8Kc3RhdGljIHUzMiBod19hcmVhZCh1MzIgYWRkciwgdTMyIG1hc2spCnsKCXJldHVybiBpb3JlYWQzMihhZGRyICsgaHdfYmFuay5hYnMpICYgbWFzazsKfQoKLyoqCiAqIGh3X2F3cml0ZTogd3JpdGVzIHRvIHJlZ2lzdGVyIGJpdGZpZWxkCiAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIGJ1cyBtYXAKICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKICogQGRhdGE6IG5ldyBkYXRhCiAqLwpzdGF0aWMgdm9pZCBod19hd3JpdGUodTMyIGFkZHIsIHUzMiBtYXNrLCB1MzIgZGF0YSkKewoJaW93cml0ZTMyKGh3X2FyZWFkKGFkZHIsIH5tYXNrKSB8IChkYXRhICYgbWFzayksCgkJICBhZGRyICsgaHdfYmFuay5hYnMpOwp9CgovKioKICogaHdfY3JlYWQ6IHJlYWRzIGZyb20gcmVnaXN0ZXIgYml0ZmllbGQKICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGJpdGZpZWxkIGRhdGEKICovCnN0YXRpYyB1MzIgaHdfY3JlYWQodTMyIGFkZHIsIHUzMiBtYXNrKQp7CglyZXR1cm4gaW9yZWFkMzIoYWRkciArIGh3X2JhbmsuY2FwKSAmIG1hc2s7Cn0KCi8qKgogKiBod19jd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlciBiaXRmaWVsZAogKiBAYWRkcjogYWRkcmVzcyByZWxhdGl2ZSB0byBDQVAgb2Zmc2V0IHBsdXMgY29udGVudAogKiBAbWFzazogYml0ZmllbGQgbWFzawogKiBAZGF0YTogbmV3IGRhdGEKICovCnN0YXRpYyB2b2lkIGh3X2N3cml0ZSh1MzIgYWRkciwgdTMyIG1hc2ssIHUzMiBkYXRhKQp7Cglpb3dyaXRlMzIoaHdfY3JlYWQoYWRkciwgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwKCQkgIGFkZHIgKyBod19iYW5rLmNhcCk7Cn0KCi8qKgogKiBod19jdGVzdF9hbmRfY2xlYXI6IHRlc3RzICYgY2xlYXJzIHJlZ2lzdGVyIGJpdGZpZWxkCiAqIEBhZGRyOiBhZGRyZXNzIHJlbGF0aXZlIHRvIENBUCBvZmZzZXQgcGx1cyBjb250ZW50CiAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCiAqLwpzdGF0aWMgdTMyIGh3X2N0ZXN0X2FuZF9jbGVhcih1MzIgYWRkciwgdTMyIG1hc2spCnsKCXUzMiByZWcgPSBod19jcmVhZChhZGRyLCBtYXNrKTsKCglpb3dyaXRlMzIocmVnLCBhZGRyICsgaHdfYmFuay5jYXApOwoJcmV0dXJuIHJlZzsKfQoKLyoqCiAqIGh3X2N0ZXN0X2FuZF93cml0ZTogdGVzdHMgJiB3cml0ZXMgcmVnaXN0ZXIgYml0ZmllbGQKICogQGFkZHI6IGFkZHJlc3MgcmVsYXRpdmUgdG8gQ0FQIG9mZnNldCBwbHVzIGNvbnRlbnQKICogQG1hc2s6IGJpdGZpZWxkIG1hc2sKICogQGRhdGE6IG5ldyBkYXRhCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBiaXRmaWVsZCBkYXRhCiAqLwpzdGF0aWMgdTMyIGh3X2N0ZXN0X2FuZF93cml0ZSh1MzIgYWRkciwgdTMyIG1hc2ssIHUzMiBkYXRhKQp7Cgl1MzIgcmVnID0gaHdfY3JlYWQoYWRkciwgfjApOwoKCWlvd3JpdGUzMigocmVnICYgfm1hc2spIHwgKGRhdGEgJiBtYXNrKSwgYWRkciArIGh3X2JhbmsuY2FwKTsKCXJldHVybiAocmVnICYgbWFzaykgPj4gZmZzX25yKG1hc2spOwp9CgovKioKICogaHdfZGV2aWNlX3Jlc2V0OiByZXNldHMgY2hpcCAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICogQGJhc2U6IHJlZ2lzdGVyIGJhc2UgYWRkcmVzcwogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19kZXZpY2VfcmVzZXQodm9pZCBfX2lvbWVtICpiYXNlKQp7Cgl1MzIgcmVnOwoKCS8qIGJhbmsgaXMgYSBtb2R1bGUgdmFyaWFibGUgKi8KCWh3X2JhbmsuYWJzID0gYmFzZTsKCglod19iYW5rLmNhcCA9IGh3X2JhbmsuYWJzOwoJaHdfYmFuay5jYXAgKz0gQUJTX0NBUExFTkdUSDsKCWh3X2JhbmsuY2FwICs9IGlvcmVhZDgoaHdfYmFuay5jYXApOwoKCXJlZyA9IGh3X2FyZWFkKEFCU19IQ0NQQVJBTVMsIEhDQ1BBUkFNU19MRU4pID4+IGZmc19ucihIQ0NQQVJBTVNfTEVOKTsKCWh3X2JhbmsubHBtICA9IHJlZzsKCWh3X2Jhbmsuc2l6ZSA9IGh3X2JhbmsuY2FwIC0gaHdfYmFuay5hYnM7Cglod19iYW5rLnNpemUgKz0gQ0FQX0xBU1Q7Cglod19iYW5rLnNpemUgLz0gc2l6ZW9mKHUzMik7CgoJLyogc2hvdWxkIGZsdXNoICYgc3RvcCBiZWZvcmUgcmVzZXQgKi8KCWh3X2N3cml0ZShDQVBfRU5EUFRGTFVTSCwgfjAsIH4wKTsKCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIDApOwoKCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlNULCBVU0JDTURfUlNUKTsKCXdoaWxlIChod19jcmVhZChDQVBfVVNCQ01ELCBVU0JDTURfUlNUKSkKCQl1ZGVsYXkoMTApOyAgICAgICAgICAgICAvKiBub3QgUlRPUyBmcmllbmRseSAqLwoKCS8qIFVTQk1PREUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgc3RlcCBieSBzdGVwICovCglod19jd3JpdGUoQ0FQX1VTQk1PREUsIFVTQk1PREVfQ00sIFVTQk1PREVfQ01fSURMRSk7Cglod19jd3JpdGUoQ0FQX1VTQk1PREUsIFVTQk1PREVfQ00sIFVTQk1PREVfQ01fREVWSUNFKTsKCWh3X2N3cml0ZShDQVBfVVNCTU9ERSwgVVNCTU9ERV9TTE9NLCBVU0JNT0RFX1NMT00pOyAgLyogSFcgPj0gMi4zICovCgoJaWYgKGh3X2NyZWFkKENBUF9VU0JNT0RFLCBVU0JNT0RFX0NNKSAhPSBVU0JNT0RFX0NNX0RFVklDRSkgewoJCXByX2VycigiY2Fubm90IGVudGVyIGluIGRldmljZSBtb2RlIik7CgkJcHJfZXJyKCJscG0gPSAlaSIsIGh3X2JhbmsubHBtKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglyZWcgPSBod19hcmVhZChBQlNfRENDUEFSQU1TLCBEQ0NQQVJBTVNfREVOKSA+PiBmZnNfbnIoRENDUEFSQU1TX0RFTik7CglpZiAocmVnID09IDAgfHwgcmVnID4gRU5EUFRfTUFYKQoJCXJldHVybiAtRU5PREVWOwoKCWh3X2VwX21heCA9IHJlZzsgICAvKiBjYWNoZSBodyBFTkRQVF9NQVggKi8KCgkvKiBzZXR1cCBsb2NrIG1vZGUgPyAqLwoKCS8qIEVORFBUU0VUVVBTVEFUIGlzICcwJyBieSBkZWZhdWx0ICovCgoJLyogSENTUEFSQU1TLmJmLnBwYyBTSE9VTEQgQkUgemVybyBmb3IgZGV2aWNlICovCgoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19kZXZpY2Vfc3RhdGU6IGVuYWJsZXMvZGlzYWJsZXMgaW50ZXJydXB0cyAmIHN0YXJ0cy9zdG9wcyBkZXZpY2UgKGV4ZWN1dGUKICogICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKICogQGRtYTogMCA9PiBkaXNhYmxlLCAhMCA9PiBlbmFibGUgYW5kIHNldCBkbWEgZW5naW5lCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X2RldmljZV9zdGF0ZSh1MzIgZG1hKQp7CglpZiAoZG1hKSB7CgkJaHdfY3dyaXRlKENBUF9FTkRQVExJU1RBRERSLCB+MCwgZG1hKTsKCQkvKiBpbnRlcnJ1cHQsIGVycm9yLCBwb3J0IGNoYW5nZSwgcmVzZXQsIHNsZWVwL3N1c3BlbmQgKi8KCQlod19jd3JpdGUoQ0FQX1VTQklOVFIsIH4wLAoJCQkgICAgIFVTQmlfVUl8VVNCaV9VRUl8VVNCaV9QQ0l8VVNCaV9VUkl8VVNCaV9TTEkpOwoJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIFVTQkNNRF9SUyk7Cgl9IGVsc2UgewoJCWh3X2N3cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfUlMsIDApOwoJCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgfjAsIDApOwoJfQoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19lcF9mbHVzaDogZmx1c2ggZW5kcG9pbnQgZmlmbyAoZXhlY3V0ZSB3aXRob3V0IGludGVycnVwdGlvbikKICogQG51bTogZW5kcG9pbnQgbnVtYmVyCiAqIEBkaXI6IGVuZHBvaW50IGRpcmVjdGlvbgogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19lcF9mbHVzaChpbnQgbnVtLCBpbnQgZGlyKQp7CglpbnQgbiA9IGh3X2VwX2JpdChudW0sIGRpcik7CgoJZG8gewoJCS8qIGZsdXNoIGFueSBwZW5kaW5nIHRyYW5zZmVyICovCgkJaHdfY3dyaXRlKENBUF9FTkRQVEZMVVNILCBCSVQobiksIEJJVChuKSk7CgkJd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVEZMVVNILCBCSVQobikpKQoJCQljcHVfcmVsYXgoKTsKCX0gd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVFNUQVQsIEJJVChuKSkpOwoKCXJldHVybiAwOwp9CgovKioKICogaHdfZXBfZGlzYWJsZTogZGlzYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06IGVuZHBvaW50IG51bWJlcgogKiBAZGlyOiBlbmRwb2ludCBkaXJlY3Rpb24KICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfZXBfZGlzYWJsZShpbnQgbnVtLCBpbnQgZGlyKQp7Cglod19lcF9mbHVzaChudW0sIGRpcik7Cglod19jd3JpdGUoQ0FQX0VORFBUQ1RSTCArIG51bSAqIHNpemVvZih1MzIpLAoJCSAgZGlyID8gRU5EUFRDVFJMX1RYRSA6IEVORFBUQ1RSTF9SWEUsIDApOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19lcF9lbmFibGU6IGVuYWJsZXMgZW5kcG9pbnQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06ICBlbmRwb2ludCBudW1iZXIKICogQGRpcjogIGVuZHBvaW50IGRpcmVjdGlvbgogKiBAdHlwZTogZW5kcG9pbnQgdHlwZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19lcF9lbmFibGUoaW50IG51bSwgaW50IGRpciwgaW50IHR5cGUpCnsKCXUzMiBtYXNrLCBkYXRhOwoKCWlmIChkaXIpIHsKCQltYXNrICA9IEVORFBUQ1RSTF9UWFQ7ICAvKiB0eXBlICAgICovCgkJZGF0YSAgPSB0eXBlIDw8IGZmc19ucihtYXNrKTsKCgkJbWFzayB8PSBFTkRQVENUUkxfVFhTOyAgLyogdW5zdGFsbCAqLwoJCW1hc2sgfD0gRU5EUFRDVFJMX1RYUjsgIC8qIHJlc2V0IGRhdGEgdG9nZ2xlICovCgkJZGF0YSB8PSBFTkRQVENUUkxfVFhSOwoJCW1hc2sgfD0gRU5EUFRDVFJMX1RYRTsgIC8qIGVuYWJsZSAgKi8KCQlkYXRhIHw9IEVORFBUQ1RSTF9UWEU7Cgl9IGVsc2UgewoJCW1hc2sgID0gRU5EUFRDVFJMX1JYVDsgIC8qIHR5cGUgICAgKi8KCQlkYXRhICA9IHR5cGUgPDwgZmZzX25yKG1hc2spOwoKCQltYXNrIHw9IEVORFBUQ1RSTF9SWFM7ICAvKiB1bnN0YWxsICovCgkJbWFzayB8PSBFTkRQVENUUkxfUlhSOyAgLyogcmVzZXQgZGF0YSB0b2dnbGUgKi8KCQlkYXRhIHw9IEVORFBUQ1RSTF9SWFI7CgkJbWFzayB8PSBFTkRQVENUUkxfUlhFOyAgLyogZW5hYmxlICAqLwoJCWRhdGEgfD0gRU5EUFRDVFJMX1JYRTsKCX0KCWh3X2N3cml0ZShDQVBfRU5EUFRDVFJMICsgbnVtICogc2l6ZW9mKHUzMiksIG1hc2ssIGRhdGEpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19lcF9nZXRfaGFsdDogcmV0dXJuIGVuZHBvaW50IGhhbHQgc3RhdHVzCiAqIEBudW06IGVuZHBvaW50IG51bWJlcgogKiBAZGlyOiBlbmRwb2ludCBkaXJlY3Rpb24KICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgZW5kcG9pbnQgaGFsdGVkCiAqLwpzdGF0aWMgaW50IGh3X2VwX2dldF9oYWx0KGludCBudW0sIGludCBkaXIpCnsKCXUzMiBtYXNrID0gZGlyID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7CgoJcmV0dXJuIGh3X2NyZWFkKENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKSwgbWFzaykgPyAxIDogMDsKfQoKLyoqCiAqIGh3X2VwX2lzX3ByaW1lZDogdGVzdCBpZiBlbmRwb2ludCBpcyBwcmltZWQgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBudW06ICAgZW5kcG9pbnQgbnVtYmVyCiAqIEBkaXI6ICAgZW5kcG9pbnQgZGlyZWN0aW9uCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGVuZHBvaW50IHByaW1lZAogKi8Kc3RhdGljIGludCBod19lcF9pc19wcmltZWQoaW50IG51bSwgaW50IGRpcikKewoJdTMyIHJlZyA9IGh3X2NyZWFkKENBUF9FTkRQVFBSSU1FLCB+MCkgfCBod19jcmVhZChDQVBfRU5EUFRTVEFULCB+MCk7CgoJcmV0dXJuIHRlc3RfYml0KGh3X2VwX2JpdChudW0sIGRpciksICh2b2lkICopJnJlZyk7Cn0KCi8qKgogKiBod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9zdGF0dXM6IHRlc3QgJiBjbGVhciBzZXR1cCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKICogQG46IGJpdCBudW1iZXIgKGVuZHBvaW50KQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgc2V0dXAgc3RhdHVzCiAqLwpzdGF0aWMgaW50IGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX3N0YXR1cyhpbnQgbikKewoJcmV0dXJuIGh3X2N0ZXN0X2FuZF9jbGVhcihDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChuKSk7Cn0KCi8qKgogKiBod19lcF9wcmltZTogcHJpbWVzIGVuZHBvaW50IChleGVjdXRlIHdpdGhvdXQgaW50ZXJydXB0aW9uKQogKiBAbnVtOiAgICAgZW5kcG9pbnQgbnVtYmVyCiAqIEBkaXI6ICAgICBlbmRwb2ludCBkaXJlY3Rpb24KICogQGlzX2N0cmw6IHRydWUgaWYgY29udHJvbCBlbmRwb2ludAogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19lcF9wcmltZShpbnQgbnVtLCBpbnQgZGlyLCBpbnQgaXNfY3RybCkKewoJaW50IG4gPSBod19lcF9iaXQobnVtLCBkaXIpOwoKCS8qIHRoZSBjYWxsZXIgc2hvdWxkIGZsdXNoIGZpcnN0ICovCglpZiAoaHdfZXBfaXNfcHJpbWVkKG51bSwgZGlyKSkKCQlyZXR1cm4gLUVCVVNZOwoKCWlmIChpc19jdHJsICYmIGRpciA9PSBSWCAmJiBod19jcmVhZChDQVBfRU5EUFRTRVRVUFNUQVQsIEJJVChudW0pKSkKCQlyZXR1cm4gLUVBR0FJTjsKCglod19jd3JpdGUoQ0FQX0VORFBUUFJJTUUsIEJJVChuKSwgQklUKG4pKTsKCgl3aGlsZSAoaHdfY3JlYWQoQ0FQX0VORFBUUFJJTUUsIEJJVChuKSkpCgkJY3B1X3JlbGF4KCk7CglpZiAoaXNfY3RybCAmJiBkaXIgPT0gUlggICYmIGh3X2NyZWFkKENBUF9FTkRQVFNFVFVQU1RBVCwgQklUKG51bSkpKQoJCXJldHVybiAtRUFHQUlOOwoKCS8qIHN0YXR1cyBzaG91bHQgYmUgdGVzdGVkIGFjY29yZGluZyB3aXRoIG1hbnVhbCBidXQgaXQgZG9lc24ndCB3b3JrICovCglyZXR1cm4gMDsKfQoKLyoqCiAqIGh3X2VwX3NldF9oYWx0OiBjb25maWd1cmVzIGVwIGhhbHQgJiByZXNldHMgZGF0YSB0b2dnbGUgYWZ0ZXIgY2xlYXIgKGV4ZWN1dGUKICogICAgICAgICAgICAgICAgIHdpdGhvdXQgaW50ZXJydXB0aW9uKQogKiBAbnVtOiAgIGVuZHBvaW50IG51bWJlcgogKiBAZGlyOiAgIGVuZHBvaW50IGRpcmVjdGlvbgogKiBAdmFsdWU6IHRydWUgPT4gc3RhbGwsIGZhbHNlID0+IHVuc3RhbGwKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfZXBfc2V0X2hhbHQoaW50IG51bSwgaW50IGRpciwgaW50IHZhbHVlKQp7CglpZiAodmFsdWUgIT0gMCAmJiB2YWx1ZSAhPSAxKQoJCXJldHVybiAtRUlOVkFMOwoKCWRvIHsKCQl1MzIgYWRkciA9IENBUF9FTkRQVENUUkwgKyBudW0gKiBzaXplb2YodTMyKTsKCQl1MzIgbWFza194cyA9IGRpciA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOwoJCXUzMiBtYXNrX3hyID0gZGlyID8gRU5EUFRDVFJMX1RYUiA6IEVORFBUQ1RSTF9SWFI7CgoJCS8qIGRhdGEgdG9nZ2xlIC0gcmVzZXJ2ZWQgZm9yIEVQMCBidXQgaXQncyBpbiBFU1MgKi8KCQlod19jd3JpdGUoYWRkciwgbWFza194c3xtYXNrX3hyLCB2YWx1ZSA/IG1hc2tfeHMgOiBtYXNrX3hyKTsKCgl9IHdoaWxlICh2YWx1ZSAhPSBod19lcF9nZXRfaGFsdChudW0sIGRpcikpOwoKCXJldHVybiAwOwp9CgovKioKICogaHdfaW50cl9jbGVhcjogZGlzYWJsZXMgaW50ZXJydXB0ICYgY2xlYXJzIGludGVycnVwdCBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCiAqIEBuOiBpbnRlcnJ1cHQgYml0CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X2ludHJfY2xlYXIoaW50IG4pCnsKCWlmIChuID49IFJFR19CSVRTKQoJCXJldHVybiAtRUlOVkFMOwoKCWh3X2N3cml0ZShDQVBfVVNCSU5UUiwgQklUKG4pLCAwKTsKCWh3X2N3cml0ZShDQVBfVVNCU1RTLCAgQklUKG4pLCBCSVQobikpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19pbnRyX2ZvcmNlOiBlbmFibGVzIGludGVycnVwdCAmIGZvcmNlcyBpbnRlcnJ1cHQgc3RhdHVzIChleGVjdXRlIHdpdGhvdXQKICogICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQogKiBAbjogaW50ZXJydXB0IGJpdAogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBod19pbnRyX2ZvcmNlKGludCBuKQp7CglpZiAobiA+PSBSRUdfQklUUykKCQlyZXR1cm4gLUVJTlZBTDsKCglod19hd3JpdGUoQUJTX1RFU1RNT0RFLCBURVNUTU9ERV9GT1JDRSwgVEVTVE1PREVfRk9SQ0UpOwoJaHdfY3dyaXRlKENBUF9VU0JJTlRSLCAgQklUKG4pLCBCSVQobikpOwoJaHdfY3dyaXRlKENBUF9VU0JTVFMsICAgQklUKG4pLCBCSVQobikpOwoJaHdfYXdyaXRlKEFCU19URVNUTU9ERSwgVEVTVE1PREVfRk9SQ0UsIDApOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod19pc19wb3J0X2hpZ2hfc3BlZWQ6IHRlc3QgaWYgcG9ydCBpcyBoaWdoIHNwZWVkCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGhpZ2ggc3BlZWQgcG9ydAogKi8Kc3RhdGljIGludCBod19wb3J0X2lzX2hpZ2hfc3BlZWQodm9pZCkKewoJcmV0dXJuIGh3X2JhbmsubHBtID8gaHdfY3JlYWQoQ0FQX0RFVkxDLCBERVZMQ19QU1BEKSA6CgkJaHdfY3JlYWQoQ0FQX1BPUlRTQywgUE9SVFNDX0hTUCk7Cn0KCi8qKgogKiBod19wb3J0X3Rlc3RfZ2V0OiByZWFkcyBwb3J0IHRlc3QgbW9kZSB2YWx1ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcG9ydCB0ZXN0IG1vZGUgdmFsdWUKICovCnN0YXRpYyB1OCBod19wb3J0X3Rlc3RfZ2V0KHZvaWQpCnsKCXJldHVybiBod19jcmVhZChDQVBfUE9SVFNDLCBQT1JUU0NfUFRDKSA+PiBmZnNfbnIoUE9SVFNDX1BUQyk7Cn0KCi8qKgogKiBod19wb3J0X3Rlc3Rfc2V0OiB3cml0ZXMgcG9ydCB0ZXN0IG1vZGUgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBtb2RlOiBuZXcgdmFsdWUKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfcG9ydF90ZXN0X3NldCh1OCBtb2RlKQp7Cgljb25zdCB1OCBURVNUX01PREVfTUFYID0gNzsKCglpZiAobW9kZSA+IFRFU1RfTU9ERV9NQVgpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaHdfY3dyaXRlKENBUF9QT1JUU0MsIFBPUlRTQ19QVEMsIG1vZGUgPDwgZmZzX25yKFBPUlRTQ19QVEMpKTsKCXJldHVybiAwOwp9CgovKioKICogaHdfcmVhZF9pbnRyX2VuYWJsZTogcmV0dXJucyBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBkYXRhCiAqLwpzdGF0aWMgdTMyIGh3X3JlYWRfaW50cl9lbmFibGUodm9pZCkKewoJcmV0dXJuIGh3X2NyZWFkKENBUF9VU0JJTlRSLCB+MCk7Cn0KCi8qKgogKiBod19yZWFkX2ludHJfc3RhdHVzOiByZXR1cm5zIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHJlZ2lzdGVyIGRhdGEKICovCnN0YXRpYyB1MzIgaHdfcmVhZF9pbnRyX3N0YXR1cyh2b2lkKQp7CglyZXR1cm4gaHdfY3JlYWQoQ0FQX1VTQlNUUywgfjApOwp9CgovKioKICogaHdfcmVnaXN0ZXJfcmVhZDogcmVhZHMgYWxsIGRldmljZSByZWdpc3RlcnMgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEBidWY6ICBkZXN0aW5hdGlvbiBidWZmZXIKICogQHNpemU6IGJ1ZmZlciBzaXplCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBudW1iZXIgb2YgcmVnaXN0ZXJzIHJlYWQKICovCnN0YXRpYyBzaXplX3QgaHdfcmVnaXN0ZXJfcmVhZCh1MzIgKmJ1Ziwgc2l6ZV90IHNpemUpCnsKCXVuc2lnbmVkIGk7CgoJaWYgKHNpemUgPiBod19iYW5rLnNpemUpCgkJc2l6ZSA9IGh3X2Jhbmsuc2l6ZTsKCglmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQoJCWJ1ZltpXSA9IGh3X2FyZWFkKGkgKiBzaXplb2YodTMyKSwgfjApOwoKCXJldHVybiBzaXplOwp9CgovKioKICogaHdfcmVnaXN0ZXJfd3JpdGU6IHdyaXRlcyB0byByZWdpc3RlcgogKiBAYWRkcjogcmVnaXN0ZXIgYWRkcmVzcwogKiBAZGF0YTogcmVnaXN0ZXIgdmFsdWUKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCnN0YXRpYyBpbnQgaHdfcmVnaXN0ZXJfd3JpdGUodTE2IGFkZHIsIHUzMiBkYXRhKQp7CgkvKiBhbGlnbiAqLwoJYWRkciAvPSBzaXplb2YodTMyKTsKCglpZiAoYWRkciA+PSBod19iYW5rLnNpemUpCgkJcmV0dXJuIC1FSU5WQUw7CgoJLyogYWxpZ24gKi8KCWFkZHIgKj0gc2l6ZW9mKHUzMik7CgoJaHdfYXdyaXRlKGFkZHIsIH4wLCBkYXRhKTsKCXJldHVybiAwOwp9CgovKioKICogaHdfdGVzdF9hbmRfY2xlYXJfY29tcGxldGU6IHRlc3QgJiBjbGVhciBjb21wbGV0ZSBzdGF0dXMgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQogKiBAbjogYml0IG51bWJlciAoZW5kcG9pbnQpCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjb21wbGV0ZSBzdGF0dXMKICovCnN0YXRpYyBpbnQgaHdfdGVzdF9hbmRfY2xlYXJfY29tcGxldGUoaW50IG4pCnsKCXJldHVybiBod19jdGVzdF9hbmRfY2xlYXIoQ0FQX0VORFBUQ09NUExFVEUsIEJJVChuKSk7Cn0KCi8qKgogKiBod190ZXN0X2FuZF9jbGVhcl9pbnRyX2FjdGl2ZTogdGVzdCAmIGNsZWFyIGFjdGl2ZSBpbnRlcnJ1cHRzIChleGVjdXRlCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGludGVycnVwdGlvbikKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFjdGl2ZSBpbnRlcnJ1dHBzCiAqLwpzdGF0aWMgdTMyIGh3X3Rlc3RfYW5kX2NsZWFyX2ludHJfYWN0aXZlKHZvaWQpCnsKCXUzMiByZWcgPSBod19yZWFkX2ludHJfc3RhdHVzKCkgJiBod19yZWFkX2ludHJfZW5hYmxlKCk7CgoJaHdfY3dyaXRlKENBUF9VU0JTVFMsIH4wLCByZWcpOwoJcmV0dXJuIHJlZzsKfQoKLyoqCiAqIGh3X3Rlc3RfYW5kX2NsZWFyX3NldHVwX2d1YXJkOiB0ZXN0ICYgY2xlYXIgc2V0dXAgZ3VhcmQgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aW9uKQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZ3VhcmQgdmFsdWUKICovCnN0YXRpYyBpbnQgaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfZ3VhcmQodm9pZCkKewoJcmV0dXJuIGh3X2N0ZXN0X2FuZF93cml0ZShDQVBfVVNCQ01ELCBVU0JDTURfU1VUVywgMCk7Cn0KCi8qKgogKiBod190ZXN0X2FuZF9zZXRfc2V0dXBfZ3VhcmQ6IHRlc3QgJiBzZXQgc2V0dXAgZ3VhcmQgKGV4ZWN1dGUgd2l0aG91dAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlvbikKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGd1YXJkIHZhbHVlCiAqLwpzdGF0aWMgaW50IGh3X3Rlc3RfYW5kX3NldF9zZXR1cF9ndWFyZCh2b2lkKQp7CglyZXR1cm4gaHdfY3Rlc3RfYW5kX3dyaXRlKENBUF9VU0JDTUQsIFVTQkNNRF9TVVRXLCBVU0JDTURfU1VUVyk7Cn0KCi8qKgogKiBod191c2Jfc2V0X2FkZHJlc3M6IGNvbmZpZ3VyZXMgVVNCIGFkZHJlc3MgKGV4ZWN1dGUgd2l0aG91dCBpbnRlcnJ1cHRpb24pCiAqIEB2YWx1ZTogbmV3IFVTQiBhZGRyZXNzCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X3VzYl9zZXRfYWRkcmVzcyh1OCB2YWx1ZSkKewoJLyogYWR2YW5jZSAqLwoJaHdfY3dyaXRlKENBUF9ERVZJQ0VBRERSLCBERVZJQ0VBRERSX1VTQkFEUiB8IERFVklDRUFERFJfVVNCQURSQSwKCQkgIHZhbHVlIDw8IGZmc19ucihERVZJQ0VBRERSX1VTQkFEUikgfCBERVZJQ0VBRERSX1VTQkFEUkEpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBod191c2JfcmVzZXQ6IHJlc3RhcnQgZGV2aWNlIGFmdGVyIGEgYnVzIHJlc2V0IChleGVjdXRlIHdpdGhvdXQKICogICAgICAgICAgICAgICBpbnRlcnJ1cHRpb24pCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGh3X3VzYl9yZXNldCh2b2lkKQp7Cglod191c2Jfc2V0X2FkZHJlc3MoMCk7CgoJLyogRVNTIGZsdXNoZXMgb25seSBhdCBlbmQ/IT8gKi8KCWh3X2N3cml0ZShDQVBfRU5EUFRGTFVTSCwgICAgfjAsIH4wKTsgICAvKiBmbHVzaCBhbGwgRVBzICovCgoJLyogY2xlYXIgc2V0dXAgdG9rZW4gc2VtYXBob3JlcyAqLwoJaHdfY3dyaXRlKENBUF9FTkRQVFNFVFVQU1RBVCwgMCwgIDApOyAgIC8qIHdyaXRlcyBpdHMgY29udGVudCAqLwoKCS8qIGNsZWFyIGNvbXBsZXRlIHN0YXR1cyAqLwoJaHdfY3dyaXRlKENBUF9FTkRQVENPTVBMRVRFLCAgMCwgIDApOyAgIC8qIHdyaXRlcyBpdHMgY29udGVudCAqLwoKCS8qIHdhaXQgdW50aWwgYWxsIGJpdHMgY2xlYXJlZCAqLwoJd2hpbGUgKGh3X2NyZWFkKENBUF9FTkRQVFBSSU1FLCB+MCkpCgkJdWRlbGF5KDEwKTsgICAgICAgICAgICAgLyogbm90IFJUT1MgZnJpZW5kbHkgKi8KCgkvKiByZXNldCBhbGwgZW5kcG9pbnRzID8gKi8KCgkvKiByZXNldCBpbnRlcm5hbCBzdGF0dXMgYW5kIHdhaXQgZm9yIGZ1cnRoZXIgaW5zdHJ1Y3Rpb25zCgkgICBubyBuZWVkIHRvIHZlcmlmeSB0aGUgcG9ydCByZXNldCBzdGF0dXMgKEVTUyBkb2VzIGl0KSAqLwoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERCRyBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgogKiBzaG93X2RldmljZTogcHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IGRldmljZSBjYXBhYmlsaXRpZXMgYW5kIHN0YXR1cwogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICBjaGFyICpidWYpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7CglzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gJnVkYy0+Z2FkZ2V0OwoJaW50IG4gPSAwOwoKCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCXJldHVybiAwOwoJfQoKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJzcGVlZCAgICAgICAgICAgICA9ICVkXG4iLAoJCSAgICAgICBnYWRnZXQtPnNwZWVkKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJpc19kdWFsc3BlZWQgICAgICA9ICVkXG4iLAoJCSAgICAgICBnYWRnZXQtPmlzX2R1YWxzcGVlZCk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiaXNfb3RnICAgICAgICAgICAgPSAlZFxuIiwKCQkgICAgICAgZ2FkZ2V0LT5pc19vdGcpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImlzX2FfcGVyaXBoZXJhbCAgID0gJWRcbiIsCgkJICAgICAgIGdhZGdldC0+aXNfYV9wZXJpcGhlcmFsKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJiX2hucF9lbmFibGUgICAgICA9ICVkXG4iLAoJCSAgICAgICBnYWRnZXQtPmJfaG5wX2VuYWJsZSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiYV9obnBfc3VwcG9ydCAgICAgPSAlZFxuIiwKCQkgICAgICAgZ2FkZ2V0LT5hX2hucF9zdXBwb3J0KTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJhX2FsdF9obnBfc3VwcG9ydCA9ICVkXG4iLAoJCSAgICAgICBnYWRnZXQtPmFfYWx0X2hucF9zdXBwb3J0KTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJuYW1lICAgICAgICAgICAgICA9ICVzXG4iLAoJCSAgICAgICAoZ2FkZ2V0LT5uYW1lID8gZ2FkZ2V0LT5uYW1lIDogIiIpKTsKCglyZXR1cm4gbjsKfQpzdGF0aWMgREVWSUNFX0FUVFIoZGV2aWNlLCBTX0lSVVNSLCBzaG93X2RldmljZSwgTlVMTCk7CgovKioKICogc2hvd19kcml2ZXI6IHByaW50cyBpbmZvcm1hdGlvbiBhYm91dCBhdHRhY2hlZCBnYWRnZXQgKGlmIGFueSkKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19kcml2ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJICAgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIgPSB1ZGMtPmRyaXZlcjsKCWludCBuID0gMDsKCglkYmdfdHJhY2UoIlslc10gJXBcbiIsIF9fZnVuY19fLCBidWYpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoZHJpdmVyID09IE5VTEwpCgkJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwKCQkJCSAiVGhlcmUgaXMgbm8gZ2FkZ2V0IGF0dGFjaGVkIVxuIik7CgoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgImZ1bmN0aW9uICA9ICVzXG4iLAoJCSAgICAgICAoZHJpdmVyLT5mdW5jdGlvbiA/IGRyaXZlci0+ZnVuY3Rpb24gOiAiIikpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIm1heCBzcGVlZCA9ICVkXG4iLAoJCSAgICAgICBkcml2ZXItPnNwZWVkKTsKCglyZXR1cm4gbjsKfQpzdGF0aWMgREVWSUNFX0FUVFIoZHJpdmVyLCBTX0lSVVNSLCBzaG93X2RyaXZlciwgTlVMTCk7CgovKiBNYXhpbXVtIGV2ZW50IG1lc3NhZ2UgbGVuZ3RoICovCiNkZWZpbmUgREJHX0RBVEFfTVNHICAgNjRVTAoKLyogTWF4aW11bSBldmVudCBtZXNzYWdlcyAqLwojZGVmaW5lIERCR19EQVRBX01BWCAgIDEyOFVMCgovKiBFdmVudCBidWZmZXIgZGVzY3JpcHRvciAqLwpzdGF0aWMgc3RydWN0IHsKCWNoYXIgICAgIChidWZbREJHX0RBVEFfTUFYXSlbREJHX0RBVEFfTVNHXTsgICAvKiBidWZmZXIgKi8KCXVuc2lnbmVkIGlkeDsgICAvKiBpbmRleCAqLwoJdW5zaWduZWQgdHR5OyAgIC8qIHByaW50IHRvIGNvbnNvbGU/ICovCglyd2xvY2tfdCBsY2s7ICAgLyogbG9jayAqLwp9IGRiZ19kYXRhID0gewoJLmlkeCA9IDAsCgkudHR5ID0gMCwKCS5sY2sgPSBfX1JXX0xPQ0tfVU5MT0NLRUQobGNrKQp9OwoKLyoqCiAqIGRiZ19kZWM6IGRlY3JlbWVudHMgZGVidWcgZXZlbnQgaW5kZXgKICogQGlkeDogYnVmZmVyIGluZGV4CiAqLwpzdGF0aWMgdm9pZCBkYmdfZGVjKHVuc2lnbmVkICppZHgpCnsKCSppZHggPSAoKmlkeCAtIDEpICYgKERCR19EQVRBX01BWC0xKTsKfQoKLyoqCiAqIGRiZ19pbmM6IGluY3JlbWVudHMgZGVidWcgZXZlbnQgaW5kZXgKICogQGlkeDogYnVmZmVyIGluZGV4CiAqLwpzdGF0aWMgdm9pZCBkYmdfaW5jKHVuc2lnbmVkICppZHgpCnsKCSppZHggPSAoKmlkeCArIDEpICYgKERCR19EQVRBX01BWC0xKTsKfQoKLyoqCiAqIGRiZ19wcmludDogIHByaW50cyB0aGUgY29tbW9uIHBhcnQgb2YgdGhlIGV2ZW50CiAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKICogQG5hbWU6ICAgZXZlbnQgbmFtZQogKiBAc3RhdHVzOiBzdGF0dXMKICogQGV4dHJhOiAgZXh0cmEgaW5mb3JtYXRpb24KICovCnN0YXRpYyB2b2lkIGRiZ19wcmludCh1OCBhZGRyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc3RhdHVzLCBjb25zdCBjaGFyICpleHRyYSkKewoJc3RydWN0IHRpbWV2YWwgdHZhbDsKCXVuc2lnbmVkIGludCBzdGFtcDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJd3JpdGVfbG9ja19pcnFzYXZlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKCglkb19nZXR0aW1lb2ZkYXkoJnR2YWwpOwoJc3RhbXAgPSB0dmFsLnR2X3NlYyAmIDB4RkZGRjsJLyogMl4zMiA9IDQyOTQ5NjcyOTYuIExpbWl0IHRvIDQwOTZzICovCglzdGFtcCA9IHN0YW1wICogMTAwMDAwMCArIHR2YWwudHZfdXNlYzsKCglzY25wcmludGYoZGJnX2RhdGEuYnVmW2RiZ19kYXRhLmlkeF0sIERCR19EQVRBX01TRywKCQkgICIlMDRYXHS7ICUwMlggJS03LjdzICU0aSCrXHQlc1xuIiwKCQkgIHN0YW1wLCBhZGRyLCBuYW1lLCBzdGF0dXMsIGV4dHJhKTsKCglkYmdfaW5jKCZkYmdfZGF0YS5pZHgpOwoKCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKCglpZiAoZGJnX2RhdGEudHR5ICE9IDApCgkJcHJfbm90aWNlKCIlMDRYXHS7ICUwMlggJS03LjdzICU0aSCrXHQlc1xuIiwKCQkJICBzdGFtcCwgYWRkciwgbmFtZSwgc3RhdHVzLCBleHRyYSk7Cn0KCi8qKgogKiBkYmdfZG9uZTogcHJpbnRzIGEgRE9ORSBldmVudAogKiBAYWRkcjogICBlbmRwb2ludCBhZGRyZXNzCiAqIEB0ZDogICAgIHRyYW5zZmVyIGRlc2NyaXB0b3IKICogQHN0YXR1czogc3RhdHVzCiAqLwpzdGF0aWMgdm9pZCBkYmdfZG9uZSh1OCBhZGRyLCBjb25zdCB1MzIgdG9rZW4sIGludCBzdGF0dXMpCnsKCWNoYXIgbXNnW0RCR19EQVRBX01TR107CgoJc2NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICIlZCAlMDJYIiwKCQkgIChpbnQpKHRva2VuICYgVERfVE9UQUxfQllURVMpID4+IGZmc19ucihURF9UT1RBTF9CWVRFUyksCgkJICAoaW50KSh0b2tlbiAmIFREX1NUQVRVUykgICAgICA+PiBmZnNfbnIoVERfU1RBVFVTKSk7CglkYmdfcHJpbnQoYWRkciwgIkRPTkUiLCBzdGF0dXMsIG1zZyk7Cn0KCi8qKgogKiBkYmdfZXZlbnQ6IHByaW50cyBhIGdlbmVyaWMgZXZlbnQKICogQGFkZHI6ICAgZW5kcG9pbnQgYWRkcmVzcwogKiBAbmFtZTogICBldmVudCBuYW1lCiAqIEBzdGF0dXM6IHN0YXR1cwogKi8Kc3RhdGljIHZvaWQgZGJnX2V2ZW50KHU4IGFkZHIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzdGF0dXMpCnsKCWlmIChuYW1lICE9IE5VTEwpCgkJZGJnX3ByaW50KGFkZHIsIG5hbWUsIHN0YXR1cywgIiIpOwp9CgovKgogKiBkYmdfcXVldWU6IHByaW50cyBhIFFVRVVFIGV2ZW50CiAqIEBhZGRyOiAgIGVuZHBvaW50IGFkZHJlc3MKICogQHJlcTogICAgVVNCIHJlcXVlc3QKICogQHN0YXR1czogc3RhdHVzCiAqLwpzdGF0aWMgdm9pZCBkYmdfcXVldWUodTggYWRkciwgY29uc3Qgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIGludCBzdGF0dXMpCnsKCWNoYXIgbXNnW0RCR19EQVRBX01TR107CgoJaWYgKHJlcSAhPSBOVUxMKSB7CgkJc2NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCgkJCSAgIiVkICVkIiwgIXJlcS0+bm9faW50ZXJydXB0LCByZXEtPmxlbmd0aCk7CgkJZGJnX3ByaW50KGFkZHIsICJRVUVVRSIsIHN0YXR1cywgbXNnKTsKCX0KfQoKLyoqCiAqIGRiZ19zZXR1cDogcHJpbnRzIGEgU0VUVVAgZXZlbnQKICogQGFkZHI6IGVuZHBvaW50IGFkZHJlc3MKICogQHJlcTogIHNldHVwIHJlcXVlc3QKICovCnN0YXRpYyB2b2lkIGRiZ19zZXR1cCh1OCBhZGRyLCBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXEpCnsKCWNoYXIgbXNnW0RCR19EQVRBX01TR107CgoJaWYgKHJlcSAhPSBOVUxMKSB7CgkJc2NucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksCgkJCSAgIiUwMlggJTAyWCAlMDRYICUwNFggJWQiLCByZXEtPmJSZXF1ZXN0VHlwZSwKCQkJICByZXEtPmJSZXF1ZXN0LCBsZTE2X3RvX2NwdShyZXEtPndWYWx1ZSksCgkJCSAgbGUxNl90b19jcHUocmVxLT53SW5kZXgpLCBsZTE2X3RvX2NwdShyZXEtPndMZW5ndGgpKTsKCQlkYmdfcHJpbnQoYWRkciwgIlNFVFVQIiwgMCwgbXNnKTsKCX0KfQoKLyoqCiAqIHNob3dfZXZlbnRzOiBkaXNwbGF5cyB0aGUgZXZlbnQgYnVmZmVyCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHNob3dfZXZlbnRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgIGNoYXIgKmJ1ZikKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGksIGosIG4gPSAwOwoKCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCXJldHVybiAwOwoJfQoKCXJlYWRfbG9ja19pcnFzYXZlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKCglpID0gZGJnX2RhdGEuaWR4OwoJZm9yIChkYmdfZGVjKCZpKTsgaSAhPSBkYmdfZGF0YS5pZHg7IGRiZ19kZWMoJmkpKSB7CgkJbiArPSBzdHJsZW4oZGJnX2RhdGEuYnVmW2ldKTsKCQlpZiAobiA+PSBQQUdFX1NJWkUpIHsKCQkJbiAtPSBzdHJsZW4oZGJnX2RhdGEuYnVmW2ldKTsKCQkJYnJlYWs7CgkJfQoJfQoJZm9yIChqID0gMCwgZGJnX2luYygmaSk7IGogPCBuOyBkYmdfaW5jKCZpKSkKCQlqICs9IHNjbnByaW50ZihidWYgKyBqLCBQQUdFX1NJWkUgLSBqLAoJCQkgICAgICAgIiVzIiwgZGJnX2RhdGEuYnVmW2ldKTsKCglyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZkYmdfZGF0YS5sY2ssIGZsYWdzKTsKCglyZXR1cm4gbjsKfQoKLyoqCiAqIHN0b3JlX2V2ZW50czogY29uZmlndXJlIGlmIGV2ZW50cyBhcmUgZ29pbmcgdG8gYmUgYWxzbyBwcmludGVkIHRvIGNvbnNvbGUKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc3RvcmVfZXZlbnRzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKewoJdW5zaWduZWQgdHR5OwoKCWRiZ190cmFjZSgiWyVzXSAlcCwgJWRcbiIsIF9fZnVuY19fLCBidWYsIGNvdW50KTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJZ290byBkb25lOwoJfQoKCWlmIChzc2NhbmYoYnVmLCAiJXUiLCAmdHR5KSAhPSAxIHx8IHR0eSA+IDEpIHsKCQlkZXZfZXJyKGRldiwgIjwxfDA+OiBlbmFibGV8ZGlzYWJsZSBjb25zb2xlIGxvZ1xuIik7CgkJZ290byBkb25lOwoJfQoKCWRiZ19kYXRhLnR0eSA9IHR0eTsKCWRldl9pbmZvKGRldiwgInR0eSA9ICV1IiwgZGJnX2RhdGEudHR5KTsKCiBkb25lOgoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBERVZJQ0VfQVRUUihldmVudHMsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X2V2ZW50cywgc3RvcmVfZXZlbnRzKTsKCi8qKgogKiBzaG93X2ludGVyczogaW50ZXJydXB0IHN0YXR1cywgZW5hYmxlIHN0YXR1cyBhbmQgaGlzdG9yaWMKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19pbnRlcnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJICAgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXUzMiBpbnRyOwoJdW5zaWduZWQgaSwgaiwgbiA9IDA7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CgoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKCQkgICAgICAgInN0YXR1cyA9ICUwOHhcbiIsIGh3X3JlYWRfaW50cl9zdGF0dXMoKSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCSAgICAgICAiZW5hYmxlID0gJTA4eFxuIiwgaHdfcmVhZF9pbnRyX2VuYWJsZSgpKTsKCgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiKnRlc3QgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudGVzdCk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyB1aSAgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3MudWkpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgdWVpID0gJWRcbiIsCgkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnVlaSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiuyBwY2kgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3MucGNpKTsKCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICK7IHVyaSA9ICVkXG4iLAoJCSAgICAgICBpc3Jfc3RhdGlzdGljcy51cmkpOwoJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIrsgc2xpID0gJWRcbiIsCgkJICAgICAgIGlzcl9zdGF0aXN0aWNzLnNsaSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiKm5vbmUgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3Mubm9uZSk7CgluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAiKmhuZGwgPSAlZFxuIiwKCQkgICAgICAgaXNyX3N0YXRpc3RpY3MuaG5kbC5jbnQpOwoKCWZvciAoaSA9IGlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4LCBqID0gMDsgaiA8PSBJU1JfTUFTSzsgaisrLCBpKyspIHsKCQlpICAgJj0gSVNSX01BU0s7CgkJaW50ciA9IGlzcl9zdGF0aXN0aWNzLmhuZGwuYnVmW2ldOwoKCQlpZiAoVVNCaV9VSSAgJiBpbnRyKQoJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAidWkgICIpOwoJCWludHIgJj0gflVTQmlfVUk7CgkJaWYgKFVTQmlfVUVJICYgaW50cikKCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInVlaSAiKTsKCQlpbnRyICY9IH5VU0JpX1VFSTsKCQlpZiAoVVNCaV9QQ0kgJiBpbnRyKQoJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLCAicGNpICIpOwoJCWludHIgJj0gflVTQmlfUENJOwoJCWlmIChVU0JpX1VSSSAmIGludHIpCgkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJ1cmkgIik7CgkJaW50ciAmPSB+VVNCaV9VUkk7CgkJaWYgKFVTQmlfU0xJICYgaW50cikKCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgInNsaSAiKTsKCQlpbnRyICY9IH5VU0JpX1NMSTsKCQlpZiAoaW50cikKCQkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwgIj8/PyAiKTsKCQlpZiAoaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaV0pCgkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sICJcbiIpOwoJfQoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CgoJcmV0dXJuIG47Cn0KCi8qKgogKiBzdG9yZV9pbnRlcnM6IGVuYWJsZSAmIGZvcmNlIG9yIGRpc2FibGUgYW4gaW5kaXZpZHVhbCBpbnRlcnJ1dHBzCiAqICAgICAgICAgICAgICAgICAgICh0byBiZSB1c2VkIGZvciB0ZXN0IHB1cnBvc2VzIG9ubHkpCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHN0b3JlX2ludGVycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgZW4sIGJpdDsKCglkYmdfdHJhY2UoIlslc10gJXAsICVkXG4iLCBfX2Z1bmNfXywgYnVmLCBjb3VudCk7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCWdvdG8gZG9uZTsKCX0KCglpZiAoc3NjYW5mKGJ1ZiwgIiV1ICV1IiwgJmVuLCAmYml0KSAhPSAyIHx8IGVuID4gMSkgewoJCWRldl9lcnIoZGV2LCAiPDF8MD4gPGJpdD46IGVuYWJsZXxkaXNhYmxlIGludGVycnVwdCIpOwoJCWdvdG8gZG9uZTsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCWlmIChlbikgewoJCWlmIChod19pbnRyX2ZvcmNlKGJpdCkpCgkJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBiaXQgbnVtYmVyXG4iKTsKCQllbHNlCgkJCWlzcl9zdGF0aXN0aWNzLnRlc3QrKzsKCX0gZWxzZSB7CgkJaWYgKGh3X2ludHJfY2xlYXIoYml0KSkKCQkJZGV2X2VycihkZXYsICJpbnZhbGlkIGJpdCBudW1iZXJcbiIpOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCiBkb25lOgoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBERVZJQ0VfQVRUUihpbnRlcnMsIFNfSVJVU1IgfCBTX0lXVVNSLCBzaG93X2ludGVycywgc3RvcmVfaW50ZXJzKTsKCi8qKgogKiBzaG93X3BvcnRfdGVzdDogcmVhZHMgcG9ydCB0ZXN0IG1vZGUKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19wb3J0X3Rlc3Qoc3RydWN0IGRldmljZSAqZGV2LAoJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIG1vZGU7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7Cgltb2RlID0gaHdfcG9ydF90ZXN0X2dldCgpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAibW9kZSA9ICV1XG4iLCBtb2RlKTsKfQoKLyoqCiAqIHN0b3JlX3BvcnRfdGVzdDogd3JpdGVzIHBvcnQgdGVzdCBtb2RlCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHN0b3JlX3BvcnRfdGVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCgkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNpMTN4eHgsIGdhZGdldC5kZXYpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIG1vZGU7CgoJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlnb3RvIGRvbmU7Cgl9CgoJaWYgKHNzY2FuZihidWYsICIldSIsICZtb2RlKSAhPSAxKSB7CgkJZGV2X2VycihkZXYsICI8bW9kZT46IHNldCBwb3J0IHRlc3QgbW9kZSIpOwoJCWdvdG8gZG9uZTsKCX0KCglzcGluX2xvY2tfaXJxc2F2ZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCWlmIChod19wb3J0X3Rlc3Rfc2V0KG1vZGUpKQoJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBtb2RlXG4iKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CgogZG9uZToKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgREVWSUNFX0FUVFIocG9ydF90ZXN0LCBTX0lSVVNSIHwgU19JV1VTUiwKCQkgICBzaG93X3BvcnRfdGVzdCwgc3RvcmVfcG9ydF90ZXN0KTsKCi8qKgogKiBzaG93X3FoZWFkczogRE1BIGNvbnRlbnRzIG9mIGFsbCBxdWV1ZSBoZWFkcwogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzaG93X3FoZWFkcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICBjaGFyICpidWYpCnsKCXN0cnVjdCBjaTEzeHh4ICp1ZGMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2kxM3h4eCwgZ2FkZ2V0LmRldik7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaSwgaiwgbiA9IDA7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7Cglmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKCQlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwID0gJnVkYy0+Y2kxM3h4eF9lcFtpXTsKCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCQkgICAgICAgIkVQPSUwMmk6IFJYPSUwOFggVFg9JTA4WFxuIiwKCQkJICAgICAgIGksICh1MzIpbUVwLT5xaFtSWF0uZG1hLCAodTMyKW1FcC0+cWhbVFhdLmRtYSk7CgkJZm9yIChqID0gMDsgaiA8IChzaXplb2Yoc3RydWN0IGNpMTN4eHhfcWgpL3NpemVvZih1MzIpKTsgaisrKSB7CgkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCgkJCQkgICAgICAgIiAlMDRYOiAgICAlMDhYICAgICUwOFhcbiIsIGosCgkJCQkgICAgICAgKigodTMyICopbUVwLT5xaFtSWF0ucHRyICsgaiksCgkJCQkgICAgICAgKigodTMyICopbUVwLT5xaFtUWF0ucHRyICsgaikpOwoJCX0KCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CgoJcmV0dXJuIG47Cn0Kc3RhdGljIERFVklDRV9BVFRSKHFoZWFkcywgU19JUlVTUiwgc2hvd19xaGVhZHMsIE5VTEwpOwoKLyoqCiAqIHNob3dfcmVnaXN0ZXJzOiBkdW1wcyBhbGwgcmVnaXN0ZXJzCiAqCiAqIENoZWNrICJkZXZpY2UuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBzc2l6ZV90IHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBkZXZpY2UgKmRldiwKCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZHVtcFs1MTJdOwoJdW5zaWduZWQgaSwgaywgbiA9IDA7CgoJZGJnX3RyYWNlKCJbJXNdICVwXG4iLCBfX2Z1bmNfXywgYnVmKTsKCWlmIChhdHRyID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKCQlkZXZfZXJyKGRldiwgIlslc10gRUlOVkFMXG4iLCBfX2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CglrID0gaHdfcmVnaXN0ZXJfcmVhZChkdW1wLCBzaXplb2YoZHVtcCkvc2l6ZW9mKHUzMikpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglmb3IgKGkgPSAwOyBpIDwgazsgaSsrKSB7CgkJbiArPSBzY25wcmludGYoYnVmICsgbiwgUEFHRV9TSVpFIC0gbiwKCQkJICAgICAgICJyZWdbMHglMDRYXSA9IDB4JTA4WFxuIiwKCQkJICAgICAgIGkgKiAodW5zaWduZWQpc2l6ZW9mKHUzMiksIGR1bXBbaV0pOwoJfQoKCXJldHVybiBuOwp9CgovKioKICogc3RvcmVfcmVnaXN0ZXJzOiB3cml0ZXMgdmFsdWUgdG8gcmVnaXN0ZXIgYWRkcmVzcwogKgogKiBDaGVjayAiZGV2aWNlLmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgc3NpemVfdCBzdG9yZV9yZWdpc3RlcnMoc3RydWN0IGRldmljZSAqZGV2LAoJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCgkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKCXVuc2lnbmVkIGxvbmcgYWRkciwgZGF0YSwgZmxhZ3M7CgoJZGJnX3RyYWNlKCJbJXNdICVwLCAlZFxuIiwgX19mdW5jX18sIGJ1ZiwgY291bnQpOwoJaWYgKGF0dHIgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgewoJCWRldl9lcnIoZGV2LCAiWyVzXSBFSU5WQUxcbiIsIF9fZnVuY19fKTsKCQlnb3RvIGRvbmU7Cgl9CgoJaWYgKHNzY2FuZihidWYsICIlbGkgJWxpIiwgJmFkZHIsICZkYXRhKSAhPSAyKSB7CgkJZGV2X2VycihkZXYsICI8YWRkcj4gPGRhdGE+OiB3cml0ZSBkYXRhIHRvIHJlZ2lzdGVyIGFkZHJlc3MiKTsKCQlnb3RvIGRvbmU7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUodWRjLT5sb2NrLCBmbGFncyk7CglpZiAoaHdfcmVnaXN0ZXJfd3JpdGUoYWRkciwgZGF0YSkpCgkJZGV2X2VycihkZXYsICJpbnZhbGlkIGFkZHJlc3MgcmFuZ2VcbiIpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCiBkb25lOgoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBERVZJQ0VfQVRUUihyZWdpc3RlcnMsIFNfSVJVU1IgfCBTX0lXVVNSLAoJCSAgIHNob3dfcmVnaXN0ZXJzLCBzdG9yZV9yZWdpc3RlcnMpOwoKLyoqCiAqIHNob3dfcmVxdWVzdHM6IERNQSBjb250ZW50cyBvZiBhbGwgcmVxdWVzdHMgY3VycmVudGx5IHF1ZXVlZCAoYWxsIGVuZHB0cykKICoKICogQ2hlY2sgImRldmljZS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19yZXF1ZXN0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAoJCQkgICAgIGNoYXIgKmJ1ZikKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQuZGV2KTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglzdHJ1Y3QgbGlzdF9oZWFkICAgKnB0ciA9IE5VTEw7CglzdHJ1Y3QgY2kxM3h4eF9yZXEgKnJlcSA9IE5VTEw7Cgl1bnNpZ25lZCBpLCBqLCBrLCBuID0gMCwgcVNpemUgPSBzaXplb2Yoc3RydWN0IGNpMTN4eHhfdGQpL3NpemVvZih1MzIpOwoKCWRiZ190cmFjZSgiWyVzXSAlcFxuIiwgX19mdW5jX18sIGJ1Zik7CglpZiAoYXR0ciA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CgkJZGV2X2VycihkZXYsICJbJXNdIEVJTlZBTFxuIiwgX19mdW5jX18pOwoJCXJldHVybiAwOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKQoJCWZvciAoayA9IFJYOyBrIDw9IFRYOyBrKyspCgkJCWxpc3RfZm9yX2VhY2gocHRyLCAmdWRjLT5jaTEzeHh4X2VwW2ldLnFoW2tdLnF1ZXVlKQoJCQl7CgkJCQlyZXEgPSBsaXN0X2VudHJ5KHB0ciwKCQkJCQkJIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOwoKCQkJCW4gKz0gc2NucHJpbnRmKGJ1ZiArIG4sIFBBR0VfU0laRSAtIG4sCgkJCQkJICAgICAgICJFUD0lMDJpOiBURD0lMDhYICVzXG4iLAoJCQkJCSAgICAgICBpLCAodTMyKXJlcS0+ZG1hLAoJCQkJCSAgICAgICAoKGsgPT0gUlgpID8gIlJYIiA6ICJUWCIpKTsKCgkJCQlmb3IgKGogPSAwOyBqIDwgcVNpemU7IGorKykKCQkJCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBQQUdFX1NJWkUgLSBuLAoJCQkJCQkgICAgICAgIiAlMDRYOiAgICAlMDhYXG4iLCBqLAoJCQkJCQkgICAgICAgKigodTMyICopcmVxLT5wdHIgKyBqKSk7CgkJCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodWRjLT5sb2NrLCBmbGFncyk7CgoJcmV0dXJuIG47Cn0Kc3RhdGljIERFVklDRV9BVFRSKHJlcXVlc3RzLCBTX0lSVVNSLCBzaG93X3JlcXVlc3RzLCBOVUxMKTsKCi8qKgogKiBkYmdfY3JlYXRlX2ZpbGVzOiBpbml0aWFsaXplcyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQogKiBAZGV2OiBkZXZpY2UKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCl9fbWF5YmVfdW51c2VkIHN0YXRpYyBpbnQgZGJnX2NyZWF0ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCWludCByZXR2YWwgPSAwOwoKCWlmIChkZXYgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9kZXZpY2UpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGRvbmU7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9kZXZpY2U7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZXZlbnRzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9kcml2ZXI7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9ldmVudHM7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9pbnRlcnM7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcWhlYWRzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9wb3J0X3Rlc3Q7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKCWlmIChyZXR2YWwpCgkJZ290byBybV9xaGVhZHM7CglyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVxdWVzdHMpOwoJaWYgKHJldHZhbCkKCQlnb3RvIHJtX3JlZ2lzdGVyczsKCXJldHVybiAwOwoKIHJtX3JlZ2lzdGVyczoKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZWdpc3RlcnMpOwogcm1fcWhlYWRzOgoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3FoZWFkcyk7CiBybV9wb3J0X3Rlc3Q6CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcG9ydF90ZXN0KTsKIHJtX2ludGVyczoKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9pbnRlcnMpOwogcm1fZXZlbnRzOgoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2V2ZW50cyk7CiBybV9kcml2ZXI6CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZHJpdmVyKTsKIHJtX2RldmljZToKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9kZXZpY2UpOwogZG9uZToKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiBkYmdfcmVtb3ZlX2ZpbGVzOiBkZXN0cm95cyB0aGUgYXR0cmlidXRlIGludGVyZmFjZQogKiBAZGV2OiBkZXZpY2UKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICovCl9fbWF5YmVfdW51c2VkIHN0YXRpYyBpbnQgZGJnX3JlbW92ZV9maWxlcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCWlmIChkZXYgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9yZXF1ZXN0cyk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcmVnaXN0ZXJzKTsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9xaGVhZHMpOwoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3BvcnRfdGVzdCk7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfaW50ZXJzKTsKCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9ldmVudHMpOwoJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX2RyaXZlcik7CglkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfZGV2aWNlKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFVUSUwgYmxvY2sKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioKICogX3VzYl9hZGRyOiBjYWxjdWxhdGVzIGVuZHBvaW50IGFkZHJlc3MgZnJvbSBkaXJlY3Rpb24gJiBudW1iZXIKICogQGVwOiAgZW5kcG9pbnQKICovCnN0YXRpYyBpbmxpbmUgdTggX3VzYl9hZGRyKHN0cnVjdCBjaTEzeHh4X2VwICplcCkKewoJcmV0dXJuICgoZXAtPmRpciA9PSBUWCkgPyBVU0JfRU5EUE9JTlRfRElSX01BU0sgOiAwKSB8IGVwLT5udW07Cn0KCi8qKgogKiBfaGFyZHdhcmVfcXVldWU6IGNvbmZpZ3VyZXMgYSByZXF1ZXN0IGF0IGhhcmR3YXJlIGxldmVsCiAqIEBnYWRnZXQ6IGdhZGdldAogKiBAbUVwOiAgICBlbmRwb2ludAogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKi8Kc3RhdGljIGludCBfaGFyZHdhcmVfZW5xdWV1ZShzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwLCBzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEpCnsKCXVuc2lnbmVkIGk7CgoJdHJhY2UoIiVwLCAlcCIsIG1FcCwgbVJlcSk7CgoJLyogZG9uJ3QgcXVldWUgdHdpY2UgKi8KCWlmIChtUmVxLT5yZXEuc3RhdHVzID09IC1FQUxSRUFEWSkKCQlyZXR1cm4gLUVBTFJFQURZOwoKCWlmIChod19lcF9pc19wcmltZWQobUVwLT5udW0sIG1FcC0+ZGlyKSkKCQlyZXR1cm4gLUVCVVNZOwoKCW1SZXEtPnJlcS5zdGF0dXMgPSAtRUFMUkVBRFk7CgoJaWYgKG1SZXEtPnJlcS5sZW5ndGggJiYgIW1SZXEtPnJlcS5kbWEpIHsKCQltUmVxLT5yZXEuZG1hID0gXAoJCQlkbWFfbWFwX3NpbmdsZShtRXAtPmRldmljZSwgbVJlcS0+cmVxLmJ1ZiwKCQkJCSAgICAgICBtUmVxLT5yZXEubGVuZ3RoLCBtRXAtPmRpciA/CgkJCQkgICAgICAgRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CgkJaWYgKG1SZXEtPnJlcS5kbWEgPT0gMCkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCW1SZXEtPm1hcCA9IDE7Cgl9CgoJLyoKCSAqIFREIGNvbmZpZ3VyYXRpb24KCSAqIFRPRE8gLSBoYW5kbGUgcmVxdWVzdHMgd2hpY2ggc3Bhd25zIGludG8gc2V2ZXJhbCBURHMKCSAqLwoJbWVtc2V0KG1SZXEtPnB0ciwgMCwgc2l6ZW9mKCptUmVxLT5wdHIpKTsKCW1SZXEtPnB0ci0+bmV4dCAgICB8PSBURF9URVJNSU5BVEU7CgltUmVxLT5wdHItPnRva2VuICAgID0gbVJlcS0+cmVxLmxlbmd0aCA8PCBmZnNfbnIoVERfVE9UQUxfQllURVMpOwoJbVJlcS0+cHRyLT50b2tlbiAgICY9IFREX1RPVEFMX0JZVEVTOwoJbVJlcS0+cHRyLT50b2tlbiAgIHw9IFREX0lPQzsKCW1SZXEtPnB0ci0+dG9rZW4gICB8PSBURF9TVEFUVVNfQUNUSVZFOwoJbVJlcS0+cHRyLT5wYWdlWzBdICA9IG1SZXEtPnJlcS5kbWE7Cglmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQoJCW1SZXEtPnB0ci0+cGFnZVtpXSA9CgkJCShtUmVxLT5yZXEuZG1hICsgaSAqIFBBR0VfU0laRSkgJiB+VERfUkVTRVJWRURfTUFTSzsKCgkvKgoJICogIFFIIGNvbmZpZ3VyYXRpb24KCSAqICBBdCB0aGlzIHBvaW50IGl0J3MgZ3VhcmFudGVlZCBleGNsdXNpdmUgYWNjZXNzIHRvIHFoZWFkCgkgKiAgKGVuZHB0IGlzIG5vdCBwcmltZWQpIHNvIGl0J3Mgbm8gbmVlZCB0byB1c2UgdHJpcHdpcmUKCSAqLwoJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT50ZC5uZXh0ICAgPSBtUmVxLT5kbWE7ICAgIC8qIFRFUk1JTkFURSA9IDAgKi8KCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+dGQudG9rZW4gJj0gflREX1NUQVRVUzsgICAvKiBjbGVhciBzdGF0dXMgKi8KCWlmIChtUmVxLT5yZXEuemVybyA9PSAwKQoJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwIHw9ICBRSF9aTFQ7CgllbHNlCgkJbUVwLT5xaFttRXAtPmRpcl0ucHRyLT5jYXAgJj0gflFIX1pMVDsKCgl3bWIoKTsgICAvKiBzeW5jaHJvbml6ZSBiZWZvcmUgZXAgcHJpbWUgKi8KCglyZXR1cm4gaHdfZXBfcHJpbWUobUVwLT5udW0sIG1FcC0+ZGlyLAoJCQkgICBtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7Cn0KCi8qKgogKiBfaGFyZHdhcmVfZGVxdWV1ZTogaGFuZGxlcyBhIHJlcXVlc3QgYXQgaGFyZHdhcmUgbGV2ZWwKICogQGdhZGdldDogZ2FkZ2V0CiAqIEBtRXA6ICAgIGVuZHBvaW50CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IF9oYXJkd2FyZV9kZXF1ZXVlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsIHN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSkKewoJdHJhY2UoIiVwLCAlcCIsIG1FcCwgbVJlcSk7CgoJaWYgKG1SZXEtPnJlcS5zdGF0dXMgIT0gLUVBTFJFQURZKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmIChod19lcF9pc19wcmltZWQobUVwLT5udW0sIG1FcC0+ZGlyKSkKCQlod19lcF9mbHVzaChtRXAtPm51bSwgbUVwLT5kaXIpOwoKCW1SZXEtPnJlcS5zdGF0dXMgPSAwOwoKCWlmIChtUmVxLT5tYXApIHsKCQlkbWFfdW5tYXBfc2luZ2xlKG1FcC0+ZGV2aWNlLCBtUmVxLT5yZXEuZG1hLCBtUmVxLT5yZXEubGVuZ3RoLAoJCQkJIG1FcC0+ZGlyID8gRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRSk7CgkJbVJlcS0+cmVxLmRtYSA9IDA7CgkJbVJlcS0+bWFwICAgICA9IDA7Cgl9CgoJbVJlcS0+cmVxLnN0YXR1cyA9IG1SZXEtPnB0ci0+dG9rZW4gJiBURF9TVEFUVVM7CglpZiAgICAgICgoVERfU1RBVFVTX0FDVElWRSAmIG1SZXEtPnJlcS5zdGF0dXMpICE9IDApCgkJbVJlcS0+cmVxLnN0YXR1cyA9IC1FQ09OTlJFU0VUOwoJZWxzZSBpZiAoKFREX1NUQVRVU19IQUxURUQgJiBtUmVxLT5yZXEuc3RhdHVzKSAhPSAwKQoJCW1SZXEtPnJlcS5zdGF0dXMgPSAtMTsKCWVsc2UgaWYgKChURF9TVEFUVVNfRFRfRVJSICYgbVJlcS0+cmVxLnN0YXR1cykgIT0gMCkKCQltUmVxLT5yZXEuc3RhdHVzID0gLTE7CgllbHNlIGlmICgoVERfU1RBVFVTX1RSX0VSUiAmIG1SZXEtPnJlcS5zdGF0dXMpICE9IDApCgkJbVJlcS0+cmVxLnN0YXR1cyA9IC0xOwoKCW1SZXEtPnJlcS5hY3R1YWwgICA9IG1SZXEtPnB0ci0+dG9rZW4gJiBURF9UT1RBTF9CWVRFUzsKCW1SZXEtPnJlcS5hY3R1YWwgPj49IGZmc19ucihURF9UT1RBTF9CWVRFUyk7CgltUmVxLT5yZXEuYWN0dWFsICAgPSBtUmVxLT5yZXEubGVuZ3RoIC0gbVJlcS0+cmVxLmFjdHVhbDsKCW1SZXEtPnJlcS5hY3R1YWwgICA9IG1SZXEtPnJlcS5zdGF0dXMgPyAwIDogbVJlcS0+cmVxLmFjdHVhbDsKCglyZXR1cm4gbVJlcS0+cmVxLmFjdHVhbDsKfQoKLyoqCiAqIF9lcF9udWtlOiBkZXF1ZXVlcyBhbGwgZW5kcG9pbnQgcmVxdWVzdHMKICogQG1FcDogZW5kcG9pbnQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCiAqLwpzdGF0aWMgaW50IF9lcF9udWtlKHN0cnVjdCBjaTEzeHh4X2VwICptRXApCl9fcmVsZWFzZXMobUVwLT5sb2NrKQpfX2FjcXVpcmVzKG1FcC0+bG9jaykKewoJdHJhY2UoIiVwIiwgbUVwKTsKCglpZiAobUVwID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaHdfZXBfZmx1c2gobUVwLT5udW0sIG1FcC0+ZGlyKTsKCgl3aGlsZSAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgewoKCQkvKiBwb3Agb2xkZXN0IHJlcXVlc3QgKi8KCQlzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBcCgkJCWxpc3RfZW50cnkobUVwLT5xaFttRXAtPmRpcl0ucXVldWUubmV4dCwKCQkJCSAgIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOwoJCWxpc3RfZGVsX2luaXQoJm1SZXEtPnF1ZXVlKTsKCQltUmVxLT5yZXEuc3RhdHVzID0gLUVTSFVURE9XTjsKCgkJaWYgKCFtUmVxLT5yZXEubm9faW50ZXJydXB0ICYmIG1SZXEtPnJlcS5jb21wbGV0ZSAhPSBOVUxMKSB7CgkJCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CgkJCW1SZXEtPnJlcS5jb21wbGV0ZSgmbUVwLT5lcCwgJm1SZXEtPnJlcSk7CgkJCXNwaW5fbG9jayhtRXAtPmxvY2spOwoJCX0KCX0KCXJldHVybiAwOwp9CgovKioKICogX2dhZGdldF9zdG9wX2FjdGl2aXR5OiBzdG9wcyBhbGwgVVNCIGFjdGl2aXR5LCBmbHVzaGVzICYgZGlzYWJsZXMgYWxsIGVuZHB0cwogKiBAZ2FkZ2V0OiBnYWRnZXQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCiAqLwpzdGF0aWMgaW50IF9nYWRnZXRfc3RvcF9hY3Rpdml0eShzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQpfX3JlbGVhc2VzKHVkYy0+bG9jaykKX19hY3F1aXJlcyh1ZGMtPmxvY2spCnsKCXN0cnVjdCB1c2JfZXAgKmVwOwoJc3RydWN0IGNpMTN4eHggICAgKnVkYyA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBjaTEzeHh4LCBnYWRnZXQpOwoJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9IGNvbnRhaW5lcl9vZihnYWRnZXQtPmVwMCwKCQkJCQkgICAgICBzdHJ1Y3QgY2kxM3h4eF9lcCwgZXApOwoKCXRyYWNlKCIlcCIsIGdhZGdldCk7CgoJaWYgKGdhZGdldCA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgoJLyogZmx1c2ggYWxsIGVuZHBvaW50cyAqLwoJZ2FkZ2V0X2Zvcl9lYWNoX2VwKGVwLCBnYWRnZXQpIHsKCQl1c2JfZXBfZmlmb19mbHVzaChlcCk7Cgl9Cgl1c2JfZXBfZmlmb19mbHVzaChnYWRnZXQtPmVwMCk7CgoJdWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QoZ2FkZ2V0KTsKCgkvKiBtYWtlIHN1cmUgdG8gZGlzYWJsZSBhbGwgZW5kcG9pbnRzICovCglnYWRnZXRfZm9yX2VhY2hfZXAoZXAsIGdhZGdldCkgewoJCXVzYl9lcF9kaXNhYmxlKGVwKTsKCX0KCXVzYl9lcF9kaXNhYmxlKGdhZGdldC0+ZXAwKTsKCglpZiAobUVwLT5zdGF0dXMgIT0gTlVMTCkgewoJCXVzYl9lcF9mcmVlX3JlcXVlc3QoZ2FkZ2V0LT5lcDAsIG1FcC0+c3RhdHVzKTsKCQltRXAtPnN0YXR1cyA9IE5VTEw7Cgl9CgoJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CgoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVNSIGJsb2NrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIGlzcl9yZXNldF9oYW5kbGVyOiBVU0IgcmVzZXQgaW50ZXJydXB0IGhhbmRsZXIKICogQHVkYzogVURDIGRldmljZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBVU0IgZW5naW5lIGFmdGVyIGEgYnVzIHJlc2V0IG9jY3VycmVkCiAqLwpzdGF0aWMgdm9pZCBpc3JfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgY2kxM3h4eCAqdWRjKQpfX3JlbGVhc2VzKHVkYy0+bG9jaykKX19hY3F1aXJlcyh1ZGMtPmxvY2spCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwWzBdOwoJaW50IHJldHZhbDsKCgl0cmFjZSgiJXAiLCB1ZGMpOwoKCWlmICh1ZGMgPT0gTlVMTCkgewoJCWVycigiRUlOVkFMIik7CgkJcmV0dXJuOwoJfQoKCWRiZ19ldmVudCgweEZGLCAiQlVTIFJTVCIsIDApOwoKCXJldHZhbCA9IF9nYWRnZXRfc3RvcF9hY3Rpdml0eSgmdWRjLT5nYWRnZXQpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGRvbmU7CgoJcmV0dmFsID0gaHdfdXNiX3Jlc2V0KCk7CglpZiAocmV0dmFsKQoJCWdvdG8gZG9uZTsKCglzcGluX3VubG9jayh1ZGMtPmxvY2spOwoJcmV0dmFsID0gdXNiX2VwX2VuYWJsZSgmbUVwLT5lcCwgJmN0cmxfZW5kcHRfZGVzYyk7CglpZiAoIXJldHZhbCkgewoJCW1FcC0+c3RhdHVzID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoJm1FcC0+ZXAsIEdGUF9LRVJORUwpOwoJCWlmIChtRXAtPnN0YXR1cyA9PSBOVUxMKSB7CgkJCXVzYl9lcF9kaXNhYmxlKCZtRXAtPmVwKTsKCQkJcmV0dmFsID0gLUVOT01FTTsKCQl9Cgl9CglzcGluX2xvY2sodWRjLT5sb2NrKTsKCiBkb25lOgoJaWYgKHJldHZhbCkKCQllcnIoImVycm9yOiAlaSIsIHJldHZhbCk7Cn0KCi8qKgogKiBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZTogZ2V0X3N0YXR1cyByZXF1ZXN0IGNvbXBsZXRlIGZ1bmN0aW9uCiAqIEBlcDogIGVuZHBvaW50CiAqIEByZXE6IHJlcXVlc3QgaGFuZGxlZAogKgogKiBDYWxsZXIgbXVzdCByZWxlYXNlIGxvY2sKICovCnN0YXRpYyB2b2lkIGlzcl9nZXRfc3RhdHVzX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKewoJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOwoKCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMKSB7CgkJZXJyKCJFSU5WQUwiKTsKCQlyZXR1cm47Cgl9CgoJa2ZyZWUocmVxLT5idWYpOwoJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKfQoKLyoqCiAqIGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlOiBnZXRfc3RhdHVzIHJlcXVlc3QgcmVzcG9uc2UKICogQGVwOiAgICBlbmRwb2ludAogKiBAc2V0dXA6IHNldHVwIHJlcXVlc3QgcGFja2V0CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGlzcl9nZXRfc3RhdHVzX3Jlc3BvbnNlKHN0cnVjdCBjaTEzeHh4X2VwICptRXAsCgkJCQkgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpzZXR1cCkKX19yZWxlYXNlcyhtRXAtPmxvY2spCl9fYWNxdWlyZXMobUVwLT5sb2NrKQp7CglzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IE5VTEw7CglnZnBfdCBnZnBfZmxhZ3MgPSBHRlBfQVRPTUlDOwoJaW50IGRpciwgbnVtLCByZXR2YWw7CgoJdHJhY2UoIiVwLCAlcCIsIG1FcCwgc2V0dXApOwoKCWlmIChtRXAgPT0gTlVMTCB8fCBzZXR1cCA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CglyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCgmbUVwLT5lcCwgZ2ZwX2ZsYWdzKTsKCXNwaW5fbG9jayhtRXAtPmxvY2spOwoJaWYgKHJlcSA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoKCXJlcS0+Y29tcGxldGUgPSBpc3JfZ2V0X3N0YXR1c19jb21wbGV0ZTsKCXJlcS0+bGVuZ3RoICAgPSAyOwoJcmVxLT5idWYgICAgICA9IGt6YWxsb2MocmVxLT5sZW5ndGgsIGdmcF9mbGFncyk7CglpZiAocmVxLT5idWYgPT0gTlVMTCkgewoJCXJldHZhbCA9IC1FTk9NRU07CgkJZ290byBlcnJfZnJlZV9yZXE7Cgl9CgoJaWYgKChzZXR1cC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spID09IFVTQl9SRUNJUF9ERVZJQ0UpIHsKCQkvKiBUT0RPOiBEMSAtIFJlbW90ZSBXYWtldXA7IEQwIC0gU2VsZiBQb3dlcmVkICovCgkJcmV0dmFsID0gMDsKCX0gZWxzZSBpZiAoKHNldHVwLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgXAoJCSAgID09IFVTQl9SRUNJUF9FTkRQT0lOVCkgewoJCWRpciA9IChsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPwoJCQlUWCA6IFJYOwoJCW51bSA9ICBsZTE2X3RvX2NwdShzZXR1cC0+d0luZGV4KSAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKCQkqKCh1MTYgKilyZXEtPmJ1ZikgPSBod19lcF9nZXRfaGFsdChudW0sIGRpcik7Cgl9CgkvKiBlbHNlIGRvIG5vdGhpbmc7IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCgoJc3Bpbl91bmxvY2sobUVwLT5sb2NrKTsKCXJldHZhbCA9IHVzYl9lcF9xdWV1ZSgmbUVwLT5lcCwgcmVxLCBnZnBfZmxhZ3MpOwoJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CglpZiAocmV0dmFsKQoJCWdvdG8gZXJyX2ZyZWVfYnVmOwoKCXJldHVybiAwOwoKIGVycl9mcmVlX2J1ZjoKCWtmcmVlKHJlcS0+YnVmKTsKIGVycl9mcmVlX3JlcToKCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7Cgl1c2JfZXBfZnJlZV9yZXF1ZXN0KCZtRXAtPmVwLCByZXEpOwoJc3Bpbl9sb2NrKG1FcC0+bG9jayk7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogaXNyX3NldHVwX3N0YXR1c19waGFzZTogcXVldWVzIHRoZSBzdGF0dXMgcGhhc2Ugb2YgYSBzZXR1cCB0cmFuc2F0aW9uCiAqIEBtRXA6IGVuZHBvaW50CiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqLwpzdGF0aWMgaW50IGlzcl9zZXR1cF9zdGF0dXNfcGhhc2Uoc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKX19yZWxlYXNlcyhtRXAtPmxvY2spCl9fYWNxdWlyZXMobUVwLT5sb2NrKQp7CglpbnQgcmV0dmFsOwoKCXRyYWNlKCIlcCIsIG1FcCk7CgoJLyogbUVwIGlzIGFsd2F5cyB2YWxpZCAmIGNvbmZpZ3VyZWQgKi8KCglpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCgkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKCgltRXAtPnN0YXR1cy0+bm9faW50ZXJydXB0ID0gMTsKCglzcGluX3VubG9jayhtRXAtPmxvY2spOwoJcmV0dmFsID0gdXNiX2VwX3F1ZXVlKCZtRXAtPmVwLCBtRXAtPnN0YXR1cywgR0ZQX0FUT01JQyk7CglzcGluX2xvY2sobUVwLT5sb2NrKTsKCglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogaXNyX3RyX2NvbXBsZXRlX2xvdzogdHJhbnNhY3Rpb24gY29tcGxldGUgbG93IGxldmVsIGhhbmRsZXIKICogQG1FcDogZW5kcG9pbnQKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUKICogQ2FsbGVyIG11c3QgaG9sZCBsb2NrCiAqLwpzdGF0aWMgaW50IGlzcl90cl9jb21wbGV0ZV9sb3coc3RydWN0IGNpMTN4eHhfZXAgKm1FcCkKX19yZWxlYXNlcyhtRXAtPmxvY2spCl9fYWNxdWlyZXMobUVwLT5sb2NrKQp7CglzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXE7CglpbnQgcmV0dmFsOwoKCXRyYWNlKCIlcCIsIG1FcCk7CgoJaWYgKGxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkKCQlyZXR1cm4gLUVJTlZBTDsKCgkvKiBwb3Agb2xkZXN0IHJlcXVlc3QgKi8KCW1SZXEgPSBsaXN0X2VudHJ5KG1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlLm5leHQsCgkJCSAgc3RydWN0IGNpMTN4eHhfcmVxLCBxdWV1ZSk7CglsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CgoJcmV0dmFsID0gX2hhcmR3YXJlX2RlcXVldWUobUVwLCBtUmVxKTsKCWlmIChyZXR2YWwgPCAwKSB7CgkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRE9ORSIsIHJldHZhbCk7CgkJZ290byBkb25lOwoJfQoKCWRiZ19kb25lKF91c2JfYWRkcihtRXApLCBtUmVxLT5wdHItPnRva2VuLCByZXR2YWwpOwoKCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgewoJCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CgkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKCX0KCglpZiAoIWxpc3RfZW1wdHkoJm1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlKSkgewoJCW1SZXEgPSBsaXN0X2VudHJ5KG1FcC0+cWhbbUVwLT5kaXJdLnF1ZXVlLm5leHQsCgkJCQkgIHN0cnVjdCBjaTEzeHh4X3JlcSwgcXVldWUpOwoJCV9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7Cgl9CgogZG9uZToKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiBpc3JfdHJfY29tcGxldGVfaGFuZGxlcjogdHJhbnNhY3Rpb24gY29tcGxldGUgaW50ZXJydXB0IGhhbmRsZXIKICogQHVkYzogVURDIGRlc2NyaXB0b3IKICoKICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRyYWZmaWMgZXZlbnRzCiAqLwpzdGF0aWMgdm9pZCBpc3JfdHJfY29tcGxldGVfaGFuZGxlcihzdHJ1Y3QgY2kxM3h4eCAqdWRjKQpfX3JlbGVhc2VzKHVkYy0+bG9jaykKX19hY3F1aXJlcyh1ZGMtPmxvY2spCnsKCXVuc2lnbmVkIGk7CgoJdHJhY2UoIiVwIiwgdWRjKTsKCglpZiAodWRjID09IE5VTEwpIHsKCQllcnIoIkVJTlZBTCIpOwoJCXJldHVybjsKCX0KCglmb3IgKGkgPSAwOyBpIDwgaHdfZXBfbWF4OyBpKyspIHsKCQlzdHJ1Y3QgY2kxM3h4eF9lcCAqbUVwICA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CgkJaW50IHR5cGUsIG51bSwgZXJyID0gLUVJTlZBTDsKCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHJlcTsKCgoJCWlmIChtRXAtPmRlc2MgPT0gTlVMTCkKCQkJY29udGludWU7ICAgLyogbm90IGNvbmZpZ3VyZWQgKi8KCgkJaWYgKChtRXAtPmRpciA9PSBSWCAmJiBod190ZXN0X2FuZF9jbGVhcl9jb21wbGV0ZShpKSkgfHwKCQkgICAgKG1FcC0+ZGlyID09IFRYICYmIGh3X3Rlc3RfYW5kX2NsZWFyX2NvbXBsZXRlKGkgKyAxNikpKSB7CgkJCWVyciA9IGlzcl90cl9jb21wbGV0ZV9sb3cobUVwKTsKCQkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKSB7CgkJCQlpZiAoZXJyID4gMCkgICAvKiBuZWVkcyBzdGF0dXMgcGhhc2UgKi8KCQkJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKG1FcCk7CgkJCQlpZiAoZXJyIDwgMCkgewoJCQkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwKCQkJCQkJICAiRVJST1IiLCBlcnIpOwoJCQkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgkJCQkJaWYgKHVzYl9lcF9zZXRfaGFsdCgmbUVwLT5lcCkpCgkJCQkJCWVycigiZXJyb3I6IGVwX3NldF9oYWx0Iik7CgkJCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChtRXAtPnR5cGUgIT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCB8fAoJCSAgICAhaHdfdGVzdF9hbmRfY2xlYXJfc2V0dXBfc3RhdHVzKGkpKQoJCQljb250aW51ZTsKCgkJaWYgKGkgIT0gMCkgewoJCQl3YXJuKCJjdHJsIHRyYWZmaWMgcmVjZWl2ZWQgYXQgZW5kcG9pbnQiKTsKCQkJY29udGludWU7CgkJfQoKCQkvKiByZWFkX3NldHVwX3BhY2tldCAqLwoJCWRvIHsKCQkJaHdfdGVzdF9hbmRfc2V0X3NldHVwX2d1YXJkKCk7CgkJCW1lbWNweSgmcmVxLCAmbUVwLT5xaFtSWF0ucHRyLT5zZXR1cCwgc2l6ZW9mKHJlcSkpOwoJCX0gd2hpbGUgKCFod190ZXN0X2FuZF9jbGVhcl9zZXR1cF9ndWFyZCgpKTsKCgkJdHlwZSA9IHJlcS5iUmVxdWVzdFR5cGU7CgoJCW1FcC0+ZGlyID0gKHR5cGUgJiBVU0JfRElSX0lOKSA/IFRYIDogUlg7CgoJCWRiZ19zZXR1cChfdXNiX2FkZHIobUVwKSwgJnJlcSk7CgoJCXN3aXRjaCAocmVxLmJSZXF1ZXN0KSB7CgkJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CgkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCgkJCSAgICBsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKCQkJCWdvdG8gZGVsZWdhdGU7CgkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQoJCQkJYnJlYWs7CgkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKCQkJaWYgKCF1ZGMtPmNpMTN4eHhfZXBbbnVtXS53ZWRnZSkgewoJCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKCQkJCWVyciA9IHVzYl9lcF9jbGVhcl9oYWx0KAoJCQkJCSZ1ZGMtPmNpMTN4eHhfZXBbbnVtXS5lcCk7CgkJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKCQkJCWlmIChlcnIpCgkJCQkJYnJlYWs7CgkJCX0KCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOwoJCQlicmVhazsKCQljYXNlIFVTQl9SRVFfR0VUX1NUQVRVUzoKCQkJaWYgKHR5cGUgIT0gKFVTQl9ESVJfSU58VVNCX1JFQ0lQX0RFVklDRSkgICAmJgoJCQkgICAgdHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCgkJCSAgICB0eXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9JTlRFUkZBQ0UpKQoJCQkJZ290byBkZWxlZ2F0ZTsKCQkJaWYgKGxlMTZfdG9fY3B1KHJlcS53TGVuZ3RoKSAhPSAyIHx8CgkJCSAgICBsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSAgIT0gMCkKCQkJCWJyZWFrOwoJCQllcnIgPSBpc3JfZ2V0X3N0YXR1c19yZXNwb25zZShtRXAsICZyZXEpOwoJCQlicmVhazsKCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CgkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfREVWSUNFKSkKCQkJCWdvdG8gZGVsZWdhdGU7CgkJCWlmIChsZTE2X3RvX2NwdShyZXEud0xlbmd0aCkgIT0gMCB8fAoJCQkgICAgbGUxNl90b19jcHUocmVxLndJbmRleCkgICE9IDApCgkJCQlicmVhazsKCQkJZXJyID0gaHdfdXNiX3NldF9hZGRyZXNzKCh1OClsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSk7CgkJCWlmIChlcnIpCgkJCQlicmVhazsKCQkJZXJyID0gaXNyX3NldHVwX3N0YXR1c19waGFzZShtRXApOwoJCQlicmVhazsKCQljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6CgkJCWlmICh0eXBlICE9IChVU0JfRElSX09VVHxVU0JfUkVDSVBfRU5EUE9JTlQpICYmCgkJCSAgICBsZTE2X3RvX2NwdShyZXEud1ZhbHVlKSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKCQkJCWdvdG8gZGVsZWdhdGU7CgkJCWlmIChyZXEud0xlbmd0aCAhPSAwKQoJCQkJYnJlYWs7CgkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKCQkJbnVtICY9IFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKCgkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgkJCWVyciA9IHVzYl9lcF9zZXRfaGFsdCgmdWRjLT5jaTEzeHh4X2VwW251bV0uZXApOwoJCQlzcGluX2xvY2sodWRjLT5sb2NrKTsKCQkJaWYgKGVycikKCQkJCWJyZWFrOwoJCQllcnIgPSBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKG1FcCk7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CmRlbGVnYXRlOgoJCQlpZiAocmVxLndMZW5ndGggPT0gMCkgICAvKiBubyBkYXRhIHBoYXNlICovCgkJCQltRXAtPmRpciA9IFRYOwoKCQkJc3Bpbl91bmxvY2sodWRjLT5sb2NrKTsKCQkJZXJyID0gdWRjLT5kcml2ZXItPnNldHVwKCZ1ZGMtPmdhZGdldCwgJnJlcSk7CgkJCXNwaW5fbG9jayh1ZGMtPmxvY2spOwoJCQlicmVhazsKCQl9CgoJCWlmIChlcnIgPCAwKSB7CgkJCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkVSUk9SIiwgZXJyKTsKCgkJCXNwaW5fdW5sb2NrKHVkYy0+bG9jayk7CgkJCWlmICh1c2JfZXBfc2V0X2hhbHQoJm1FcC0+ZXApKQoJCQkJZXJyKCJlcnJvcjogZXBfc2V0X2hhbHQiKTsKCQkJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CgkJfQoJfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEVORFBUIGJsb2NrCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIGVwX2VuYWJsZTogY29uZmlndXJlIGVuZHBvaW50LCBtYWtpbmcgaXQgdXNhYmxlCiAqCiAqIENoZWNrIHVzYl9lcF9lbmFibGUoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIGludCBlcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqZXAsCgkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CglpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVwIiwgZXAsIGRlc2MpOwoKCWlmIChlcCA9PSBOVUxMIHx8IGRlc2MgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKCgkvKiBvbmx5IGludGVybmFsIFNXIHNob3VsZCBlbmFibGUgY3RybCBlbmRwdHMgKi8KCgltRXAtPmRlc2MgPSBkZXNjOwoKCWlmICghbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKQoJCXdhcm4oImVuYWJsaW5nIGEgbm9uLWVtcHR5IGVuZHBvaW50ISIpOwoKCW1FcC0+ZGlyICA9IHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykgPyBUWCA6IFJYOwoJbUVwLT5udW0gID0gdXNiX2VuZHBvaW50X251bShkZXNjKTsKCW1FcC0+dHlwZSA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpOwoKCW1FcC0+ZXAubWF4cGFja2V0ID0gX19jb25zdGFudF9sZTE2X3RvX2NwdShkZXNjLT53TWF4UGFja2V0U2l6ZSk7CgoJZGlyZWN0aW9uID0gbUVwLT5kaXI7CglkbyB7CgkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRU5BQkxFIiwgMCk7CgoJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwID0gMDsKCgkJaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQoJCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCB8PSAgUUhfSU9TOwoJCWVsc2UgaWYgKG1FcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKQoJCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPmNhcCAmPSB+UUhfTVVMVDsKCQllbHNlCgkJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwICY9IH5RSF9aTFQ7CgoJCW1FcC0+cWhbbUVwLT5kaXJdLnB0ci0+Y2FwIHw9CgkJCShtRXAtPmVwLm1heHBhY2tldCA8PCBmZnNfbnIoUUhfTUFYX1BLVCkpICYgUUhfTUFYX1BLVDsKCQltRXAtPnFoW21FcC0+ZGlyXS5wdHItPnRkLm5leHQgfD0gVERfVEVSTUlOQVRFOyAgIC8qIG5lZWRlZD8gKi8KCgkJcmV0dmFsIHw9IGh3X2VwX2VuYWJsZShtRXAtPm51bSwgbUVwLT5kaXIsIG1FcC0+dHlwZSk7CgoJCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKCQkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKCgl9IHdoaWxlIChtRXAtPmRpciAhPSBkaXJlY3Rpb24pOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogZXBfZGlzYWJsZTogZW5kcG9pbnQgaXMgbm8gbG9uZ2VyIHVzYWJsZQogKgogKiBDaGVjayB1c2JfZXBfZGlzYWJsZSgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgaW50IGVwX2Rpc2FibGUoc3RydWN0IHVzYl9lcCAqZXApCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CglpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAiLCBlcCk7CgoJaWYgKGVwID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgllbHNlIGlmIChtRXAtPmRlc2MgPT0gTlVMTCkKCQlyZXR1cm4gLUVCVVNZOwoKCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCS8qIG9ubHkgaW50ZXJuYWwgU1cgc2hvdWxkIGRpc2FibGUgY3RybCBlbmRwdHMgKi8KCglkaXJlY3Rpb24gPSBtRXAtPmRpcjsKCWRvIHsKCQlkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJESVNBQkxFIiwgMCk7CgoJCXJldHZhbCB8PSBfZXBfbnVrZShtRXApOwoJCXJldHZhbCB8PSBod19lcF9kaXNhYmxlKG1FcC0+bnVtLCBtRXAtPmRpcik7CgoJCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCkKCQkJbUVwLT5kaXIgPSAobUVwLT5kaXIgPT0gVFgpID8gUlggOiBUWDsKCgl9IHdoaWxlIChtRXAtPmRpciAhPSBkaXJlY3Rpb24pOwoKCW1FcC0+ZGVzYyA9IE5VTEw7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiBlcF9hbGxvY19yZXF1ZXN0OiBhbGxvY2F0ZSBhIHJlcXVlc3Qgb2JqZWN0IHRvIHVzZSB3aXRoIHRoaXMgZW5kcG9pbnQKICoKICogQ2hlY2sgdXNiX2VwX2FsbG9jX3JlcXVlc3QoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqZXBfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICplcCwgZ2ZwX3QgZ2ZwX2ZsYWdzKQp7CglzdHJ1Y3QgY2kxM3h4eF9lcCAgKm1FcCAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CglzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBOVUxMOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVpIiwgZXAsIGdmcF9mbGFncyk7CgoJaWYgKGVwID09IE5VTEwpIHsKCQllcnIoIkVJTlZBTCIpOwoJCXJldHVybiBOVUxMOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCW1SZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2kxM3h4eF9yZXEpLCBnZnBfZmxhZ3MpOwoJaWYgKG1SZXEgIT0gTlVMTCkgewoJCUlOSVRfTElTVF9IRUFEKCZtUmVxLT5xdWV1ZSk7CgoJCW1SZXEtPnB0ciA9IGRtYV9wb29sX2FsbG9jKG1FcC0+dGRfcG9vbCwgZ2ZwX2ZsYWdzLAoJCQkJCSAgICZtUmVxLT5kbWEpOwoJCWlmIChtUmVxLT5wdHIgPT0gTlVMTCkgewoJCQlrZnJlZShtUmVxKTsKCQkJbVJlcSA9IE5VTEw7CgkJfQoJfQoKCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkFMTE9DIiwgbVJlcSA9PSBOVUxMKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiAobVJlcSA9PSBOVUxMKSA/IE5VTEwgOiAmbVJlcS0+cmVxOwp9CgovKioKICogZXBfZnJlZV9yZXF1ZXN0OiBmcmVlcyBhIHJlcXVlc3Qgb2JqZWN0CiAqCiAqIENoZWNrIHVzYl9lcF9mcmVlX3JlcXVlc3QoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIHZvaWQgZXBfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKewoJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IGNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBjaTEzeHh4X3JlcSwgcmVxKTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOwoKCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMKSB7CgkJZXJyKCJFSU5WQUwiKTsKCQlyZXR1cm47Cgl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZtUmVxLT5xdWV1ZSkpIHsKCQllcnIoIkVCVVNZIik7CgkJcmV0dXJuOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCWlmIChtUmVxLT5wdHIpCgkJZG1hX3Bvb2xfZnJlZShtRXAtPnRkX3Bvb2wsIG1SZXEtPnB0ciwgbVJlcS0+ZG1hKTsKCWtmcmVlKG1SZXEpOwoKCWRiZ19ldmVudChfdXNiX2FkZHIobUVwKSwgIkZSRUUiLCAwKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwp9CgovKioKICogZXBfcXVldWU6IHF1ZXVlcyAoc3VibWl0cykgYW4gSS9PIHJlcXVlc3QgdG8gYW4gZW5kcG9pbnQKICoKICogQ2hlY2sgdXNiX2VwX3F1ZXVlKCkqIGF0IHVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBpbnQgZXBfcXVldWUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLAoJCSAgICBnZnBfdCBfX21heWJlX3VudXNlZCBnZnBfZmxhZ3MpCnsKCXN0cnVjdCBjaTEzeHh4X2VwICAqbUVwICA9IGNvbnRhaW5lcl9vZihlcCwgIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CglzdHJ1Y3QgY2kxM3h4eF9yZXEgKm1SZXEgPSBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgY2kxM3h4eF9yZXEsIHJlcSk7CglpbnQgcmV0dmFsID0gMDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJdHJhY2UoIiVwLCAlcCwgJVgiLCBlcCwgcmVxLCBnZnBfZmxhZ3MpOwoKCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fbG9ja19pcnFzYXZlKG1FcC0+bG9jaywgZmxhZ3MpOwoKCWlmIChtRXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCAmJgoJICAgICFsaXN0X2VtcHR5KCZtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZSkpIHsKCQlfZXBfbnVrZShtRXApOwoJCXJldHZhbCA9IC1FT1ZFUkZMT1c7CgkJd2FybigiZW5kcG9pbnQgY3RybCAlWCBudWtlZCIsIF91c2JfYWRkcihtRXApKTsKCX0KCgkvKiBmaXJzdCBudWtlIHRoZW4gdGVzdCBsaW5rLCBlLmcuIHByZXZpb3VzIHN0YXR1cyBoYXMgbm90IHNlbnQgKi8KCWlmICghbGlzdF9lbXB0eSgmbVJlcS0+cXVldWUpKSB7CgkJcmV0dmFsID0gLUVCVVNZOwoJCWVycigicmVxdWVzdCBhbHJlYWR5IGluIHF1ZXVlIik7CgkJZ290byBkb25lOwoJfQoKCWlmIChyZXEtPmxlbmd0aCA+ICg0ICogUEFHRV9TSVpFKSkgewoJCXJlcS0+bGVuZ3RoID0gKDQgKiBQQUdFX1NJWkUpOwoJCXJldHZhbCA9IC1FTVNHU0laRTsKCQl3YXJuKCJyZXF1ZXN0IGxlbmd0aCB0cnVuY2F0ZWQiKTsKCX0KCglkYmdfcXVldWUoX3VzYl9hZGRyKG1FcCksIHJlcSwgcmV0dmFsKTsKCgkvKiBwdXNoIHJlcXVlc3QgKi8KCW1SZXEtPnJlcS5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CgltUmVxLT5yZXEuYWN0dWFsID0gMDsKCWxpc3RfYWRkX3RhaWwoJm1SZXEtPnF1ZXVlLCAmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpOwoKCXJldHZhbCA9IF9oYXJkd2FyZV9lbnF1ZXVlKG1FcCwgbVJlcSk7CglpZiAocmV0dmFsID09IC1FQUxSRUFEWSB8fCByZXR2YWwgPT0gLUVCVVNZKSB7CgkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiUVVFVUUiLCByZXR2YWwpOwoJCXJldHZhbCA9IDA7Cgl9CgogZG9uZToKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7CglyZXR1cm4gcmV0dmFsOwp9CgovKioKICogZXBfZGVxdWV1ZTogZGVxdWV1ZXMgKGNhbmNlbHMsIHVubGlua3MpIGFuIEkvTyByZXF1ZXN0IGZyb20gYW4gZW5kcG9pbnQKICoKICogQ2hlY2sgdXNiX2VwX2RlcXVldWUoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIGludCBlcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKewoJc3RydWN0IGNpMTN4eHhfZXAgICptRXAgID0gY29udGFpbmVyX29mKGVwLCAgc3RydWN0IGNpMTN4eHhfZXAsIGVwKTsKCXN0cnVjdCBjaTEzeHh4X3JlcSAqbVJlcSA9IGNvbnRhaW5lcl9vZihyZXEsIHN0cnVjdCBjaTEzeHh4X3JlcSwgcmVxKTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJdHJhY2UoIiVwLCAlcCIsIGVwLCByZXEpOwoKCWlmIChlcCA9PSBOVUxMIHx8IHJlcSA9PSBOVUxMIHx8IG1FcC0+ZGVzYyA9PSBOVUxMIHx8CgkgICAgbGlzdF9lbXB0eSgmbVJlcS0+cXVldWUpICB8fCBsaXN0X2VtcHR5KCZtRXAtPnFoW21FcC0+ZGlyXS5xdWV1ZSkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CgoJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiREVRVUVVRSIsIDApOwoKCWlmIChtUmVxLT5yZXEuc3RhdHVzID09IC1FQUxSRUFEWSkKCQlfaGFyZHdhcmVfZGVxdWV1ZShtRXAsIG1SZXEpOwoKCS8qIHBvcCByZXF1ZXN0ICovCglsaXN0X2RlbF9pbml0KCZtUmVxLT5xdWV1ZSk7CglyZXEtPnN0YXR1cyA9IC1FQ09OTlJFU0VUOwoKCWlmICghbVJlcS0+cmVxLm5vX2ludGVycnVwdCAmJiBtUmVxLT5yZXEuY29tcGxldGUgIT0gTlVMTCkgewoJCXNwaW5fdW5sb2NrKG1FcC0+bG9jayk7CgkJbVJlcS0+cmVxLmNvbXBsZXRlKCZtRXAtPmVwLCAmbVJlcS0+cmVxKTsKCQlzcGluX2xvY2sobUVwLT5sb2NrKTsKCX0KCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIDA7Cn0KCi8qKgogKiBlcF9zZXRfaGFsdDogc2V0cyB0aGUgZW5kcG9pbnQgaGFsdCBmZWF0dXJlCiAqCiAqIENoZWNrIHVzYl9lcF9zZXRfaGFsdCgpIGF0ICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgaW50IGVwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgdmFsdWUpCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7CglpbnQgZGlyZWN0aW9uLCByZXR2YWwgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgl0cmFjZSgiJXAsICVpIiwgZXAsIHZhbHVlKTsKCglpZiAoZXAgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKCiNpZm5kZWYgU1RBTExfSU4KCS8qIGdfZmlsZV9zdG9yYWdlIE1TIGNvbXBsaWFudCBidXQgZ196ZXJvIGZhaWxzIGNoYXB0ZXIgOSBjb21wbGlhbmNlICovCglpZiAodmFsdWUgJiYgbUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYgbUVwLT5kaXIgPT0gVFggJiYKCSAgICAhbGlzdF9lbXB0eSgmbUVwLT5xaFttRXAtPmRpcl0ucXVldWUpKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLUVBR0FJTjsKCX0KI2VuZGlmCgoJZGlyZWN0aW9uID0gbUVwLT5kaXI7CglkbyB7CgkJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiSEFMVCIsIHZhbHVlKTsKCQlyZXR2YWwgfD0gaHdfZXBfc2V0X2hhbHQobUVwLT5udW0sIG1FcC0+ZGlyLCB2YWx1ZSk7CgoJCWlmICghdmFsdWUpCgkJCW1FcC0+d2VkZ2UgPSAwOwoKCQlpZiAobUVwLT50eXBlID09IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0wpCgkJCW1FcC0+ZGlyID0gKG1FcC0+ZGlyID09IFRYKSA/IFJYIDogVFg7CgoJfSB3aGlsZSAobUVwLT5kaXIgIT0gZGlyZWN0aW9uKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKG1FcC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIHJldHZhbDsKfQoKLyoqCiAqIGVwX3NldF93ZWRnZTogc2V0cyB0aGUgaGFsdCBmZWF0dXJlIGFuZCBpZ25vcmVzIGNsZWFyIHJlcXVlc3RzCiAqCiAqIENoZWNrIHVzYl9lcF9zZXRfd2VkZ2UoKSBhdCAidXNiX2dhZGdldC5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIGludCBlcF9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqZXApCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXRyYWNlKCIlcCIsIGVwKTsKCglpZiAoZXAgPT0gTlVMTCB8fCBtRXAtPmRlc2MgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglzcGluX2xvY2tfaXJxc2F2ZShtRXAtPmxvY2ssIGZsYWdzKTsKCglkYmdfZXZlbnQoX3VzYl9hZGRyKG1FcCksICJXRURHRSIsIDApOwoJbUVwLT53ZWRnZSA9IDE7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShtRXAtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gdXNiX2VwX3NldF9oYWx0KGVwKTsKfQoKLyoqCiAqIGVwX2ZpZm9fZmx1c2g6IGZsdXNoZXMgY29udGVudHMgb2YgYSBmaWZvCiAqCiAqIENoZWNrIHVzYl9lcF9maWZvX2ZsdXNoKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyB2b2lkIGVwX2ZpZm9fZmx1c2goc3RydWN0IHVzYl9lcCAqZXApCnsKCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSBjb250YWluZXJfb2YoZXAsIHN0cnVjdCBjaTEzeHh4X2VwLCBlcCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXRyYWNlKCIlcCIsIGVwKTsKCglpZiAoZXAgPT0gTlVMTCkgewoJCWVycigiJTAyWDogLUVJTlZBTCIsIF91c2JfYWRkcihtRXApKTsKCQlyZXR1cm47Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUobUVwLT5sb2NrLCBmbGFncyk7CgoJZGJnX2V2ZW50KF91c2JfYWRkcihtRXApLCAiRkZMVVNIIiwgMCk7Cglod19lcF9mbHVzaChtRXAtPm51bSwgbUVwLT5kaXIpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobUVwLT5sb2NrLCBmbGFncyk7Cn0KCi8qKgogKiBFbmRwb2ludC1zcGVjaWZpYyBwYXJ0IG9mIHRoZSBBUEkgdG8gdGhlIFVTQiBjb250cm9sbGVyIGhhcmR3YXJlCiAqIENoZWNrICJ1c2JfZ2FkZ2V0LmgiIGZvciBkZXRhaWxzCiAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgdXNiX2VwX29wcyA9IHsKCS5lbmFibGUJICAgICAgID0gZXBfZW5hYmxlLAoJLmRpc2FibGUgICAgICAgPSBlcF9kaXNhYmxlLAoJLmFsbG9jX3JlcXVlc3QgPSBlcF9hbGxvY19yZXF1ZXN0LAoJLmZyZWVfcmVxdWVzdCAgPSBlcF9mcmVlX3JlcXVlc3QsCgkucXVldWUJICAgICAgID0gZXBfcXVldWUsCgkuZGVxdWV1ZSAgICAgICA9IGVwX2RlcXVldWUsCgkuc2V0X2hhbHQgICAgICA9IGVwX3NldF9oYWx0LAoJLnNldF93ZWRnZSAgICAgPSBlcF9zZXRfd2VkZ2UsCgkuZmlmb19mbHVzaCAgICA9IGVwX2ZpZm9fZmx1c2gsCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdBREdFVCBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgogKiBEZXZpY2Ugb3BlcmF0aW9ucyBwYXJ0IG9mIHRoZSBBUEkgdG8gdGhlIFVTQiBjb250cm9sbGVyIGhhcmR3YXJlLAogKiB3aGljaCBkb24ndCBpbnZvbHZlIGVuZHBvaW50cyAob3IgaS9vKQogKiBDaGVjayAgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgdXNiX2dhZGdldF9vcHM7CgovKioKICogdXNiX2dhZGdldF9wcm9iZV9kcml2ZXI6IHJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlcgogKiBAZHJpdmVyOiB0aGUgZHJpdmVyIGJlaW5nIHJlZ2lzdGVyZWQKICogQGJpbmQ6IHRoZSBkcml2ZXIncyBiaW5kIGNhbGxiYWNrCiAqCiAqIENoZWNrIHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKCkgYXQgPGxpbnV4L3VzYi9nYWRnZXQuaD4gZm9yIGRldGFpbHMuCiAqIEludGVycnVwdHMgYXJlIGVuYWJsZWQgaGVyZS4KICovCmludCB1c2JfZ2FkZ2V0X3Byb2JlX2RyaXZlcihzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlciwKCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7Cgl1bnNpZ25lZCBsb25nIGksIGssIGZsYWdzOwoJaW50IHJldHZhbCA9IC1FTk9NRU07CgoJdHJhY2UoIiVwIiwgZHJpdmVyKTsKCglpZiAoZHJpdmVyICAgICAgICAgICAgID09IE5VTEwgfHwKCSAgICBiaW5kICAgICAgICAgICAgICAgPT0gTlVMTCB8fAoJICAgIGRyaXZlci0+dW5iaW5kICAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT5zZXR1cCAgICAgID09IE5VTEwgfHwKCSAgICBkcml2ZXItPmRpc2Nvbm5lY3QgPT0gTlVMTCB8fAoJICAgIGRyaXZlci0+c3VzcGVuZCAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT5yZXN1bWUgICAgID09IE5VTEwpCgkJcmV0dXJuIC1FSU5WQUw7CgllbHNlIGlmICh1ZGMgICAgICAgICA9PSBOVUxMKQoJCXJldHVybiAtRU5PREVWOwoJZWxzZSBpZiAodWRjLT5kcml2ZXIgIT0gTlVMTCkKCQlyZXR1cm4gLUVCVVNZOwoKCS8qIGFsbG9jIHJlc291cmNlcyAqLwoJdWRjLT5xaF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJjaTEzeHh4X3FoIiwgJnVkYy0+Z2FkZ2V0LmRldiwKCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNpMTN4eHhfcWgpLAoJCQkJICAgICAgIDY0LCBQQUdFX1NJWkUpOwoJaWYgKHVkYy0+cWhfcG9vbCA9PSBOVUxMKQoJCXJldHVybiAtRU5PTUVNOwoKCXVkYy0+dGRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSgiY2kxM3h4eF90ZCIsICZ1ZGMtPmdhZGdldC5kZXYsCgkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjaTEzeHh4X3RkKSwKCQkJCSAgICAgICA2NCwgUEFHRV9TSVpFKTsKCWlmICh1ZGMtPnRkX3Bvb2wgPT0gTlVMTCkgewoJCWRtYV9wb29sX2Rlc3Ryb3kodWRjLT5xaF9wb29sKTsKCQl1ZGMtPnFoX3Bvb2wgPSBOVUxMOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCWluZm8oImh3X2VwX21heCA9ICVkIiwgaHdfZXBfbWF4KTsKCgl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgPSBOVUxMOwoJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9IE5VTEw7CgoJcmV0dmFsID0gMDsKCWZvciAoaSA9IDA7IGkgPCBod19lcF9tYXg7IGkrKykgewoJCXN0cnVjdCBjaTEzeHh4X2VwICptRXAgPSAmdWRjLT5jaTEzeHh4X2VwW2ldOwoKCQlzY25wcmludGYobUVwLT5uYW1lLCBzaXplb2YobUVwLT5uYW1lKSwgImVwJWkiLCAoaW50KWkpOwoKCQltRXAtPmxvY2sgICAgICAgICA9IHVkYy0+bG9jazsKCQltRXAtPmRldmljZSAgICAgICA9ICZ1ZGMtPmdhZGdldC5kZXY7CgkJbUVwLT50ZF9wb29sICAgICAgPSB1ZGMtPnRkX3Bvb2w7CgoJCW1FcC0+ZXAubmFtZSAgICAgID0gbUVwLT5uYW1lOwoJCW1FcC0+ZXAub3BzICAgICAgID0gJnVzYl9lcF9vcHM7CgkJbUVwLT5lcC5tYXhwYWNrZXQgPSBDVFJMX1BBWUxPQURfTUFYOwoKCQkvKiB0aGlzIGFsbG9jYXRpb24gY2Fubm90IGJlIHJhbmRvbSAqLwoJCWZvciAoayA9IFJYOyBrIDw9IFRYOyBrKyspIHsKCQkJSU5JVF9MSVNUX0hFQUQoJm1FcC0+cWhba10ucXVldWUpOwoJCQltRXAtPnFoW2tdLnB0ciA9IGRtYV9wb29sX2FsbG9jKHVkYy0+cWhfcG9vbCwKCQkJCQkJCUdGUF9LRVJORUwsCgkJCQkJCQkmbUVwLT5xaFtrXS5kbWEpOwoJCQlpZiAobUVwLT5xaFtrXS5wdHIgPT0gTlVMTCkKCQkJCXJldHZhbCA9IC1FTk9NRU07CgkJCWVsc2UKCQkJCW1lbXNldChtRXAtPnFoW2tdLnB0ciwgMCwKCQkJCSAgICAgICBzaXplb2YoKm1FcC0+cWhba10ucHRyKSk7CgkJfQoJCWlmIChpID09IDApCgkJCXVkYy0+Z2FkZ2V0LmVwMCA9ICZtRXAtPmVwOwoJCWVsc2UKCQkJbGlzdF9hZGRfdGFpbCgmbUVwLT5lcC5lcF9saXN0LCAmdWRjLT5nYWRnZXQuZXBfbGlzdCk7Cgl9CglpZiAocmV0dmFsKQoJCWdvdG8gZG9uZTsKCgkvKiBiaW5kIGdhZGdldCAqLwoJZHJpdmVyLT5kcml2ZXIuYnVzICAgICA9IE5VTEw7Cgl1ZGMtPmdhZGdldC5vcHMgICAgICAgID0gJnVzYl9nYWRnZXRfb3BzOwoJdWRjLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKHVkYy0+bG9jaywgZmxhZ3MpOwoJcmV0dmFsID0gYmluZCgmdWRjLT5nYWRnZXQpOyAgICAgICAgICAgICAgICAvKiBNQVkgU0xFRVAgKi8KCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCWlmIChyZXR2YWwpIHsKCQl1ZGMtPmdhZGdldC5vcHMgICAgICAgID0gTlVMTDsKCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKCQlnb3RvIGRvbmU7Cgl9CgoJcmV0dmFsID0gaHdfZGV2aWNlX3N0YXRlKHVkYy0+Y2kxM3h4eF9lcFswXS5xaFtSWF0uZG1hKTsKCiBkb25lOgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCWlmIChyZXR2YWwpCgkJdXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOwoJcmV0dXJuIHJldHZhbDsKfQpFWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKTsKCi8qKgogKiB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyOiB1bnJlZ2lzdGVyIGEgZ2FkZ2V0IGRyaXZlcgogKgogKiBDaGVjayB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKCkgYXQgInVzYl9nYWRnZXQuaCIgZm9yIGRldGFpbHMKICovCmludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKCXVuc2lnbmVkIGxvbmcgaSwgaywgZmxhZ3M7CgoJdHJhY2UoIiVwIiwgZHJpdmVyKTsKCglpZiAoZHJpdmVyICAgICAgICAgICAgID09IE5VTEwgfHwKCSAgICBkcml2ZXItPnVuYmluZCAgICAgPT0gTlVMTCB8fAoJICAgIGRyaXZlci0+c2V0dXAgICAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyLT5kaXNjb25uZWN0ID09IE5VTEwgfHwKCSAgICBkcml2ZXItPnN1c3BlbmQgICAgPT0gTlVMTCB8fAoJICAgIGRyaXZlci0+cmVzdW1lICAgICA9PSBOVUxMIHx8CgkgICAgZHJpdmVyICAgICAgICAgICAgICE9IHVkYy0+ZHJpdmVyKQoJCXJldHVybiAtRUlOVkFMOwoKCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCWh3X2RldmljZV9zdGF0ZSgwKTsKCgkvKiB1bmJpbmQgZ2FkZ2V0ICovCglpZiAodWRjLT5nYWRnZXQub3BzICE9IE5VTEwpIHsKCQlfZ2FkZ2V0X3N0b3BfYWN0aXZpdHkoJnVkYy0+Z2FkZ2V0KTsKCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCQlkcml2ZXItPnVuYmluZCgmdWRjLT5nYWRnZXQpOyAgICAgICAgICAgICAgIC8qIE1BWSBTTEVFUCAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKHVkYy0+bG9jaywgZmxhZ3MpOwoKCQl1ZGMtPmdhZGdldC5vcHMgICAgICAgID0gTlVMTDsKCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKCX0KCgkvKiBmcmVlIHJlc291cmNlcyAqLwoJZm9yIChpID0gMDsgaSA8IGh3X2VwX21heDsgaSsrKSB7CgkJc3RydWN0IGNpMTN4eHhfZXAgKm1FcCA9ICZ1ZGMtPmNpMTN4eHhfZXBbaV07CgoJCWlmIChpID09IDApCgkJCXVkYy0+Z2FkZ2V0LmVwMCA9IE5VTEw7CgkJZWxzZSBpZiAoIWxpc3RfZW1wdHkoJm1FcC0+ZXAuZXBfbGlzdCkpCgkJCWxpc3RfZGVsX2luaXQoJm1FcC0+ZXAuZXBfbGlzdCk7CgoJCWZvciAoayA9IFJYOyBrIDw9IFRYOyBrKyspCgkJCWlmIChtRXAtPnFoW2tdLnB0ciAhPSBOVUxMKQoJCQkJZG1hX3Bvb2xfZnJlZSh1ZGMtPnFoX3Bvb2wsCgkJCQkJICAgICAgbUVwLT5xaFtrXS5wdHIsIG1FcC0+cWhba10uZG1hKTsKCX0KCgl1ZGMtPmRyaXZlciA9IE5VTEw7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1ZGMtPmxvY2ssIGZsYWdzKTsKCglpZiAodWRjLT50ZF9wb29sICE9IE5VTEwpIHsKCQlkbWFfcG9vbF9kZXN0cm95KHVkYy0+dGRfcG9vbCk7CgkJdWRjLT50ZF9wb29sID0gTlVMTDsKCX0KCWlmICh1ZGMtPnFoX3Bvb2wgIT0gTlVMTCkgewoJCWRtYV9wb29sX2Rlc3Ryb3kodWRjLT5xaF9wb29sKTsKCQl1ZGMtPnFoX3Bvb2wgPSBOVUxMOwoJfQoKCXJldHVybiAwOwp9CkVYUE9SVF9TWU1CT0wodXNiX2dhZGdldF91bnJlZ2lzdGVyX2RyaXZlcik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEJVUyBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgogKiB1ZGNfaXJxOiBnbG9iYWwgaW50ZXJydXB0IGhhbmRsZXIKICoKICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIElSUV9IQU5ETEVEIGlmIHRoZSBJUlEgaGFzIGJlZW4gaGFuZGxlZAogKiBJdCBsb2NrcyBhY2Nlc3MgdG8gcmVnaXN0ZXJzCiAqLwpzdGF0aWMgaXJxcmV0dXJuX3QgdWRjX2lycSh2b2lkKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjID0gX3VkYzsKCWlycXJldHVybl90IHJldHZhbDsKCXUzMiBpbnRyOwoKCXRyYWNlKCk7CgoJaWYgKHVkYyA9PSBOVUxMKSB7CgkJZXJyKCJFTk9ERVYiKTsKCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJc3Bpbl9sb2NrKHVkYy0+bG9jayk7CglpbnRyID0gaHdfdGVzdF9hbmRfY2xlYXJfaW50cl9hY3RpdmUoKTsKCWlmIChpbnRyKSB7CgkJaXNyX3N0YXRpc3RpY3MuaG5kbC5idWZbaXNyX3N0YXRpc3RpY3MuaG5kbC5pZHgrK10gPSBpbnRyOwoJCWlzcl9zdGF0aXN0aWNzLmhuZGwuaWR4ICY9IElTUl9NQVNLOwoJCWlzcl9zdGF0aXN0aWNzLmhuZGwuY250Kys7CgoJCS8qIG9yZGVyIGRlZmluZXMgcHJpb3JpdHkgLSBkbyBOT1QgY2hhbmdlIGl0ICovCgkJaWYgKFVTQmlfVVJJICYgaW50cikgewoJCQlpc3Jfc3RhdGlzdGljcy51cmkrKzsKCQkJaXNyX3Jlc2V0X2hhbmRsZXIodWRjKTsKCQl9CgkJaWYgKFVTQmlfUENJICYgaW50cikgewoJCQlpc3Jfc3RhdGlzdGljcy5wY2krKzsKCQkJdWRjLT5nYWRnZXQuc3BlZWQgPSBod19wb3J0X2lzX2hpZ2hfc3BlZWQoKSA/CgkJCQlVU0JfU1BFRURfSElHSCA6IFVTQl9TUEVFRF9GVUxMOwoJCX0KCQlpZiAoVVNCaV9VRUkgJiBpbnRyKQoJCQlpc3Jfc3RhdGlzdGljcy51ZWkrKzsKCQlpZiAoVVNCaV9VSSAgJiBpbnRyKSB7CgkJCWlzcl9zdGF0aXN0aWNzLnVpKys7CgkJCWlzcl90cl9jb21wbGV0ZV9oYW5kbGVyKHVkYyk7CgkJfQoJCWlmIChVU0JpX1NMSSAmIGludHIpCgkJCWlzcl9zdGF0aXN0aWNzLnNsaSsrOwoJCXJldHZhbCA9IElSUV9IQU5ETEVEOwoJfSBlbHNlIHsKCQlpc3Jfc3RhdGlzdGljcy5ub25lKys7CgkJcmV0dmFsID0gSVJRX05PTkU7Cgl9CglzcGluX3VubG9jayh1ZGMtPmxvY2spOwoKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiB1ZGNfcmVsZWFzZTogZHJpdmVyIHJlbGVhc2UgZnVuY3Rpb24KICogQGRldjogZGV2aWNlCiAqCiAqIEN1cnJlbnRseSBkb2VzIG5vdGhpbmcKICovCnN0YXRpYyB2b2lkIHVkY19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJdHJhY2UoIiVwIiwgZGV2KTsKCglpZiAoZGV2ID09IE5VTEwpCgkJZXJyKCJFSU5WQUwiKTsKfQoKLyoqCiAqIHVkY19wcm9iZTogcGFyZW50IHByb2JlIG11c3QgY2FsbCB0aGlzIHRvIGluaXRpYWxpemUgVURDCiAqIEBkZXY6ICBwYXJlbnQgZGV2aWNlCiAqIEByZWdzOiByZWdpc3RlcnMgYmFzZSBhZGRyZXNzCiAqIEBuYW1lOiBkcml2ZXIgbmFtZQogKgogKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgY29kZQogKiBObyBpbnRlcnJ1cHRzIGFjdGl2ZSwgdGhlIElSUSBoYXMgbm90IGJlZW4gcmVxdWVzdGVkIHlldAogKiBLZXJuZWwgYXNzdW1lcyAzMi1iaXQgRE1BIG9wZXJhdGlvbnMgYnkgZGVmYXVsdCwgbm8gbmVlZCB0byBkbWFfc2V0X21hc2sKICovCnN0YXRpYyBpbnQgdWRjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICpyZWdzLCBjb25zdCBjaGFyICpuYW1lKQp7CglzdHJ1Y3QgY2kxM3h4eCAqdWRjOwoJaW50IHJldHZhbCA9IDA7CgoJdHJhY2UoIiVwLCAlcCwgJXAiLCBkZXYsIHJlZ3MsIG5hbWUpOwoKCWlmIChkZXYgPT0gTlVMTCB8fCByZWdzID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQoJCXJldHVybiAtRUlOVkFMOwoKCXVkYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaTEzeHh4KSwgR0ZQX0tFUk5FTCk7CglpZiAodWRjID09IE5VTEwpCgkJcmV0dXJuIC1FTk9NRU07CgoJdWRjLT5sb2NrID0gJnVkY19sb2NrOwoKCXJldHZhbCA9IGh3X2RldmljZV9yZXNldChyZWdzKTsKCWlmIChyZXR2YWwpCgkJZ290byBkb25lOwoKCXVkYy0+Z2FkZ2V0Lm9wcyAgICAgICAgICA9IE5VTEw7Cgl1ZGMtPmdhZGdldC5zcGVlZCAgICAgICAgPSBVU0JfU1BFRURfVU5LTk9XTjsKCXVkYy0+Z2FkZ2V0LmlzX2R1YWxzcGVlZCA9IDE7Cgl1ZGMtPmdhZGdldC5pc19vdGcgICAgICAgPSAwOwoJdWRjLT5nYWRnZXQubmFtZSAgICAgICAgID0gbmFtZTsKCglJTklUX0xJU1RfSEVBRCgmdWRjLT5nYWRnZXQuZXBfbGlzdCk7Cgl1ZGMtPmdhZGdldC5lcDAgPSBOVUxMOwoKCWRldl9zZXRfbmFtZSgmdWRjLT5nYWRnZXQuZGV2LCAiZ2FkZ2V0Iik7Cgl1ZGMtPmdhZGdldC5kZXYuZG1hX21hc2sgPSBkZXYtPmRtYV9tYXNrOwoJdWRjLT5nYWRnZXQuZGV2LnBhcmVudCAgID0gZGV2OwoJdWRjLT5nYWRnZXQuZGV2LnJlbGVhc2UgID0gdWRjX3JlbGVhc2U7CgoJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZ1ZGMtPmdhZGdldC5kZXYpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGRvbmU7CgojaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKCXJldHZhbCA9IGRiZ19jcmVhdGVfZmlsZXMoJnVkYy0+Z2FkZ2V0LmRldik7CiNlbmRpZgoJaWYgKHJldHZhbCkgewoJCWRldmljZV91bnJlZ2lzdGVyKCZ1ZGMtPmdhZGdldC5kZXYpOwoJCWdvdG8gZG9uZTsKCX0KCglfdWRjID0gdWRjOwoJcmV0dXJuIHJldHZhbDsKCiBkb25lOgoJZXJyKCJlcnJvciA9ICVpIiwgcmV0dmFsKTsKCWtmcmVlKHVkYyk7CglfdWRjID0gTlVMTDsKCXJldHVybiByZXR2YWw7Cn0KCi8qKgogKiB1ZGNfcmVtb3ZlOiBwYXJlbnQgcmVtb3ZlIG11c3QgY2FsbCB0aGlzIHRvIHJlbW92ZSBVREMKICoKICogTm8gaW50ZXJydXB0cyBhY3RpdmUsIHRoZSBJUlEgaGFzIGJlZW4gcmVsZWFzZWQKICovCnN0YXRpYyB2b2lkIHVkY19yZW1vdmUodm9pZCkKewoJc3RydWN0IGNpMTN4eHggKnVkYyA9IF91ZGM7CgoJaWYgKHVkYyA9PSBOVUxMKSB7CgkJZXJyKCJFSU5WQUwiKTsKCQlyZXR1cm47Cgl9CgojaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMKCWRiZ19yZW1vdmVfZmlsZXMoJnVkYy0+Z2FkZ2V0LmRldik7CiNlbmRpZgoJZGV2aWNlX3VucmVnaXN0ZXIoJnVkYy0+Z2FkZ2V0LmRldik7CgoJa2ZyZWUodWRjKTsKCV91ZGMgPSBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBDSSBibG9jawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgogKiBjaTEzeHh4X3BjaV9pcnE6IGludGVycnV0IGhhbmRsZXIKICogQGlycTogIGlycSBudW1iZXIKICogQHBkZXY6IFVTQiBEZXZpY2UgQ29udHJvbGxlciBpbnRlcnJ1cHQgc291cmNlCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBJUlFfSEFORExFRCBpZiB0aGUgSVJRIGhhcyBiZWVuIGhhbmRsZWQKICogVGhpcyBpcyBhbiBJU1IgZG9uJ3QgdHJhY2UsIHVzZSBhdHRyaWJ1dGUgaW50ZXJmYWNlIGluc3RlYWQKICovCnN0YXRpYyBpcnFyZXR1cm5fdCBjaTEzeHh4X3BjaV9pcnEoaW50IGlycSwgdm9pZCAqcGRldikKewoJaWYgKGlycSA9PSAwKSB7CgkJZGV2X2VycigmKChzdHJ1Y3QgcGNpX2RldiAqKXBkZXYpLT5kZXYsICJJbnZhbGlkIElSUTAgdXNhZ2UhIik7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoJcmV0dXJuIHVkY19pcnEoKTsKfQoKLyoqCiAqIGNpMTN4eHhfcGNpX3Byb2JlOiBQQ0kgcHJvYmUKICogQHBkZXY6IFVTQiBkZXZpY2UgY29udHJvbGxlciBiZWluZyBwcm9iZWQKICogQGlkOiAgIFBDSSBob3RwbHVnIElEIGNvbm5lY3RpbmcgY29udHJvbGxlciB0byBVREMgZnJhbWV3b3JrCiAqCiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBlcnJvciBjb2RlCiAqIEFsbG9jYXRlcyBiYXNpYyBQQ0kgcmVzb3VyY2VzIGZvciB0aGlzIFVTQiBkZXZpY2UgY29udHJvbGxlciwgYW5kIHRoZW4KICogaW52b2tlcyB0aGUgdWRjX3Byb2JlKCkgbWV0aG9kIHRvIHN0YXJ0IHRoZSBVREMgYXNzb2NpYXRlZCB3aXRoIGl0CiAqLwpzdGF0aWMgaW50IF9fZGV2aW5pdCBjaTEzeHh4X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCnsKCXZvaWQgX19pb21lbSAqcmVncyA9IE5VTEw7CglpbnQgcmV0dmFsID0gMDsKCglpZiAoaWQgPT0gTlVMTCkKCQlyZXR1cm4gLUVJTlZBTDsKCglyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKCWlmIChyZXR2YWwpCgkJZ290byBkb25lOwoKCWlmICghcGRldi0+aXJxKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gSVJRLCBjaGVjayBCSU9TL1BDSSBzZXR1cCEiKTsKCQlyZXR2YWwgPSAtRU5PREVWOwoJCWdvdG8gZGlzYWJsZV9kZXZpY2U7Cgl9CgoJcmV0dmFsID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBVRENfRFJJVkVSX05BTUUpOwoJaWYgKHJldHZhbCkKCQlnb3RvIGRpc2FibGVfZGV2aWNlOwoKCS8qIEJBUiAwIGhvbGRzIGFsbCB0aGUgcmVnaXN0ZXJzICovCglyZWdzID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOwoJaWYgKCFyZWdzKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgbWFwcGluZyBtZW1vcnkhIik7CgkJcmV0dmFsID0gLUVGQVVMVDsKCQlnb3RvIHJlbGVhc2VfcmVnaW9uczsKCX0KCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCAoX19mb3JjZSB2b2lkICopcmVncyk7CgoJcGNpX3NldF9tYXN0ZXIocGRldik7CglwY2lfdHJ5X3NldF9td2kocGRldik7CgoJcmV0dmFsID0gdWRjX3Byb2JlKCZwZGV2LT5kZXYsIHJlZ3MsIFVEQ19EUklWRVJfTkFNRSk7CglpZiAocmV0dmFsKQoJCWdvdG8gaW91bm1hcDsKCgkvKiBvdXIgZGV2aWNlIGRvZXMgbm90IGhhdmUgTVNJIGNhcGFiaWxpdHkgKi8KCglyZXR2YWwgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGNpMTN4eHhfcGNpX2lycSwgSVJRRl9TSEFSRUQsCgkJCSAgICAgVURDX0RSSVZFUl9OQU1FLCBwZGV2KTsKCWlmIChyZXR2YWwpCgkJZ290byBnYWRnZXRfcmVtb3ZlOwoKCXJldHVybiAwOwoKIGdhZGdldF9yZW1vdmU6Cgl1ZGNfcmVtb3ZlKCk7CiBpb3VubWFwOgoJcGNpX2lvdW5tYXAocGRldiwgcmVncyk7CiByZWxlYXNlX3JlZ2lvbnM6CglwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogZGlzYWJsZV9kZXZpY2U6CglwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBkb25lOgoJcmV0dXJuIHJldHZhbDsKfQoKLyoqCiAqIGNpMTN4eHhfcGNpX3JlbW92ZTogUENJIHJlbW92ZQogKiBAcGRldjogVVNCIERldmljZSBDb250cm9sbGVyIGJlaW5nIHJlbW92ZWQKICoKICogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiBjaTEzeHh4X3BjaV9wcm9iZSgpLAogKiBmaXJzdCBpbnZva2luZyB0aGUgdWRjX3JlbW92ZSgpIGFuZCB0aGVuIHJlbGVhc2VzCiAqIGFsbCBQQ0kgcmVzb3VyY2VzIGFsbG9jYXRlZCBmb3IgdGhpcyBVU0IgZGV2aWNlIGNvbnRyb2xsZXIKICovCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjaTEzeHh4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsKCWZyZWVfaXJxKHBkZXYtPmlycSwgcGRldik7Cgl1ZGNfcmVtb3ZlKCk7CglwY2lfaW91bm1hcChwZGV2LCAoX19mb3JjZSB2b2lkIF9faW9tZW0gKilwY2lfZ2V0X2RydmRhdGEocGRldikpOwoJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKfQoKLyoqCiAqIFBDSSBkZXZpY2UgdGFibGUKICogUENJIGRldmljZSBzdHJ1Y3R1cmUKICoKICogQ2hlY2sgInBjaS5oIiBmb3IgZGV0YWlscwogKi8Kc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGNpMTN4eHhfcGNpX2lkX3RhYmxlKSA9IHsKCXsgUENJX0RFVklDRSgweDE1M0YsIDB4MTAwNCkgfSwKCXsgUENJX0RFVklDRSgweDE1M0YsIDB4MTAwNikgfSwKCXsgMCwgMCwgMCwgMCwgMCwgMCwgMCAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQp9OwpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2kxM3h4eF9wY2lfaWRfdGFibGUpOwoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNpMTN4eHhfcGNpX2RyaXZlciA9IHsKCS5uYW1lICAgICAgICAgPQlVRENfRFJJVkVSX05BTUUsCgkuaWRfdGFibGUgICAgID0JY2kxM3h4eF9wY2lfaWRfdGFibGUsCgkucHJvYmUgICAgICAgID0JY2kxM3h4eF9wY2lfcHJvYmUsCgkucmVtb3ZlICAgICAgID0JX19kZXZleGl0X3AoY2kxM3h4eF9wY2lfcmVtb3ZlKSwKfTsKCi8qKgogKiBjaTEzeHh4X3BjaV9pbml0OiBtb2R1bGUgaW5pdAogKgogKiBEcml2ZXIgbG9hZAogKi8Kc3RhdGljIGludCBfX2luaXQgY2kxM3h4eF9wY2lfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2kxM3h4eF9wY2lfZHJpdmVyKTsKfQptb2R1bGVfaW5pdChjaTEzeHh4X3BjaV9pbml0KTsKCi8qKgogKiBjaTEzeHh4X3BjaV9leGl0OiBtb2R1bGUgZXhpdAogKgogKiBEcml2ZXIgdW5sb2FkCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgY2kxM3h4eF9wY2lfZXhpdCh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNpMTN4eHhfcGNpX2RyaXZlcik7Cn0KbW9kdWxlX2V4aXQoY2kxM3h4eF9wY2lfZXhpdCk7CgpNT0RVTEVfQVVUSE9SKCJNSVBTIC0gRGF2aWQgTG9wbyA8ZGxvcG9AY2hpcGlkZWEubWlwcy5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTUlQUyBDSTEzWFhYIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpNT0RVTEVfVkVSU0lPTigiSnVuZSAyMDA4Iik7Cg==