LyoKICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgojaW5jbHVkZSA8YXNtL2ljL2FsaTUxMnguaD4KI2luY2x1ZGUgPHNzaS5oPgoKI3VuZGVmIFNDNTIwX0NEUF9ERUJVRwoKI2lmZGVmCVNDNTIwX0NEUF9ERUJVRwojZGVmaW5lCVBSSU5URihmbXQsYXJncy4uLikJcHJpbnRmIChmbXQgLCMjYXJncykKI2Vsc2UKI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKCi8qCiAqIFRoZW9yeToKICogV2UgZmlyc3Qgc2V0IHVwIGFsbCBJUlFzIHRvIGJlIG5vbi1wY2ksIGVkZ2UgdHJpZ2dlcmVkLAogKiB3aGVuIHdlIGxhdGVyIGVudW1lcmF0ZSB0aGUgcGNpIGJ1cyBhbmQgcGNpX3NjNTIwX2ZpeHVwX2lycSgpIGdldHMKICogY2FsbGVkIHdlIHJlYWxsb2NhdGUgaXJxcyB0byB0aGUgcGNpIGJ1cyB3aXRoIHNjNTIwX3BjaV9zZXRfaXJxKCkKICogYXMgbmVlZGVkLiBXaGUgY2hvb3NlIHRoZSBpcnFzIHRvIGdyYW0gZnJvbSBhIGNvbmZpZ3VyYWJsZSBsaXN0CiAqIGluc2lkZSBwY2lfc2M1MjBfZml4dXBfaXJxKCkgKElmIHRoaXMgbGlzdCBjb250YWlucyBzdHVwaWQgaXJxJ3MKICogc3VjaCBhcyAwIHRobmdhcyB3aWxsIG5vdCB3b3JrKQogKi8KCnN0YXRpYyB2b2lkIGlycV9pbml0KHZvaWQpCnsKCS8qIGRpc2FibGUgZ2xvYmFsIGludGVycnVwdCBtb2RlICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUElDSUNSLCAweDQwKTsKCgkvKiBzZXQgYWxsIGlycXMgdG8gZWRnZSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX01QSUNNT0RFLCAweDAwKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TTDFQSUNNT0RFLCAweDAwKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TTDJQSUNNT0RFLCAweDAwKTsKCgkvKiBhY3RpdmUgbG93IHBvbGFyaXR5IG9uIFBJQyBpbnRlcnJ1cHQgcGlucywKCSAqICBhY3RpdmUgaGlnaCBwb2xhcml0eSBvbiBhbGwgb3RoZXIgaXJxIHBpbnMgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wsIDB4MDAwMCk7CgoJLyogc2V0IGlycSBudW1iZXIgbWFwcGluZyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQVE1SME1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAvKiBkaXNhYmxlIEdQIHRpbWVyIDAgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BUTVIxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgIC8qIGRpc2FibGUgR1AgdGltZXIgMSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUFRNUjJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7ICAgLyogZGlzYWJsZSBHUCB0aW1lciAyIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BJVDBNQVAsIFNDNTIwX0lSUTApOyAgICAgICAgICAgICAvKiBTZXQgUElUIHRpbWVyIDAgSU5UIHRvIElSUTAgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQxTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBQSVQgdGltZXIgMSBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QSVQyTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgLyogZGlzYWJsZSBQSVQgdGltZXIgMiBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRBTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRCTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRDTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEMgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9QQ0lJTlRETUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBQQ0kgSU5UIEQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9ETUFCQ0lOVE1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgLyogZGlzYWJsZSBETUEgSU5UICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1NJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgU3luY2hyb25pdXMgc2VyaWFsIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1dEVE1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgICAgICAvKiBkaXNhYmxlIFdhdGNoZG9nIElOVCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1JUQ01BUCwgU0M1MjBfSVJROCk7ICAgICAgICAgICAgICAvKiBTZXQgUlRDIGludCB0byA4ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfV1BWTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgICAgIC8qIGRpc2FibGUgd3JpdGUgcHJvdGVjdCBJTlQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9JQ0VNQVAsIFNDNTIwX0lSUTEpOyAgICAgICAgICAgICAgLyogU2V0IElDRSBEZWJ1ZyBTZXJpZWxwb3J0IElOVCB0byBJUlExICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRkVSUk1BUCxTQzUyMF9JUlExMyk7ICAgICAgICAgICAgIC8qIFNldCBGUCBlcnJvciBJTlQgdG8gSVJRMTMgKi8KCglpZiAoQ0ZHX1VTRV9TSU9fVUFSVCkgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMU1BUCwgU0M1MjBfSVJRX0RJU0FCTEVEKTsgLyogZGlzYWJsZSBpbnRlcm5hbCBVQVJUMSBJTlQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJNQVAsIFNDNTIwX0lSUV9ESVNBQkxFRCk7IC8qIGRpc2FibGUgaW50ZXJuYWwgVUFSVDIgSU5UICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQM0lNQVAsIFNDNTIwX0lSUTMpOyAgICAgICAgICAvKiBTZXQgR1BJUlEzIChJU0EgSVJRMykgdG8gSVJRMyAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDRJTUFQLCBTQzUyMF9JUlE0KTsgICAgICAgICAgLyogU2V0IEdQSVJRNCAoSVNBIElSUTQpIHRvIElSUTQgKi8KCX0gZWxzZSB7CgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxTUFQLCBTQzUyMF9JUlE0KTsgICAgICAgICAvKiBTZXQgaW50ZXJuYWwgVUFSVDIgSU5UIHRvIElSUTQgKi8KCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJNQVAsIFNDNTIwX0lSUTMpOyAgICAgICAgIC8qIFNldCBpbnRlcm5hbCBVQVJUMiBJTlQgdG8gSVJRMyAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDNJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBHUElSUTMgKElTQSBJUlEzKSAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDRJTUFQLCBTQzUyMF9JUlFfRElTQUJMRUQpOyAgLyogZGlzYWJsZSBHUElSUTQgKElTQSBJUlE0KSAqLwoJfQoKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDFJTUFQLCBTQzUyMF9JUlExKTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRMSAoU0lPIElSUTEpIHRvIElSUTEgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDVJTUFQLCBTQzUyMF9JUlE1KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRNSAoSVNBIElSUTUpIHRvIElSUTUgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDZJTUFQLCBTQzUyMF9JUlE2KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRNiAoSVNBIElSUTYpIHRvIElSUTYgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDdJTUFQLCBTQzUyMF9JUlE3KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJRNyAoSVNBIElSUTcpIHRvIElSUTcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDhJTUFQLCBTQzUyMF9JUlE4KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJROCAoU0lPIElSUTgpIHRvIElSUTggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDlJTUFQLCBTQzUyMF9JUlE5KTsgICAgICAgICAgICAgLyogU2V0IEdQSVJROSAoSVNBIElSUTIpIHRvIElSUTkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDBJTUFQLCBTQzUyMF9JUlExMSk7ICAgICAgICAgICAgLyogU2V0IEdQSVJRMCAoSVNBIElSUTExKSB0byBJUlExMCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQMklNQVAsIFNDNTIwX0lSUTEyKTsgICAgICAgICAgICAvKiBTZXQgR1BJUlEyIChJU0EgSVJRMTIpIHRvIElSUTEyICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1AxMElNQVAsU0M1MjBfSVJRMTQpOyAgICAgICAgICAgIC8qIFNldCBHUElSUTEwIChJU0EgSVJRMTQpIHRvIElSUTE0ICovCgoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1BDSUhPU1RNQVAsIDB4MTFmKTsgICAgICAgICAgICAgICAgLyogTWFwIFBDSSBob3N0YnJpZGdlIElOVCB0byBOTUkgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9FQ0NNQVAsIDB4MTAwKTsgICAgICAgICAgICAgICAgICAgIC8qIE1hcCBTRFJBTSBFQ0MgZmFpbHVyZSBJTlQgdG8gTk1JICovCgp9CgoKLyogUENJIHN0dWZmICovCnN0YXRpYyB2b2lkIHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgcGNpX2Rldl90IGRldikKewoJLyogYSBjb25maWd1cmFibGUgbGlzdHMgb2YgaXJxcyB0byBzdGVhbAoJICogd2hlbiB3ZSBuZWVkIG9uZSAoYSBib2FyZCB3aXRoIG1vcmUgcGNpIGludGVycnVwdCBwaW5zCgkgKiB3b3VsZCB1c2UgYSBsYXJnZXIgdGFibGUgKi8KCXN0YXRpYyBpbnQgaXJxX2xpc3RbXSA9IHsKCQlDRkdfRklSU1RfUENJX0lSUSwKCQlDRkdfU0VDT05EX1BDSV9JUlEsCgkJQ0ZHX1RISVJEX1BDSV9JUlEsCgkJQ0ZHX0ZPUlRIX1BDSV9JUlEKCX07CglzdGF0aWMgaW50IG5leHRfaXJxX2luZGV4PTA7CgoJY2hhciB0bXBfcGluOwoJaW50IHBpbjsKCglwY2lfaG9zZV9yZWFkX2NvbmZpZ19ieXRlKGhvc2UsIGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZ0bXBfcGluKTsKCXBpbiA9IHRtcF9waW47CgoJcGluLT0xOyAvKiBwY2kgY29uZmlnIHNwYWNlIHVzZSAxLWJhc2VkIG51bWJlcmluZyAqLwoJaWYgKC0xID09IHBpbikgewoJCXJldHVybjsgLyogZGV2aWNlIHVzZSBubyBpcnEgKi8KCX0KCgoJLyogbWFwIGRldmljZSBudW1iZXIgKyAgcGluIHRvIGEgcGluIG9uIHRoZSBzYzUyMCAqLwoJc3dpdGNoIChQQ0lfREVWKGRldikpIHsKCWNhc2UgMjA6CgkJcGluKz1TQzUyMF9QQ0lfSU5UQTsKCQlicmVhazsKCgljYXNlIDE5OgoJCXBpbis9U0M1MjBfUENJX0lOVEI7CgkJYnJlYWs7CgoJY2FzZSAxODoKCQlwaW4rPVNDNTIwX1BDSV9JTlRDOwoJCWJyZWFrOwoKCWNhc2UgMTc6CgkJcGluKz1TQzUyMF9QQ0lfSU5URDsKCQlicmVhazsKCglkZWZhdWx0OgoJCXJldHVybjsKCX0KCglwaW4mPTM7IC8qIHdyYXAgYXJvdW5kICovCgoJaWYgKHNjNTIwX3BjaV9pbnRzW3Bpbl0gPT0gLTEpIHsKCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLwoJCWlmIChuZXh0X2lycV9pbmRleCA+IDMpIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAocGNpX3NjNTIwX3NldF9pcnEocGluLCBpcnFfbGlzdFtuZXh0X2lycV9pbmRleF0pKSB7CgkJCXJldHVybjsKCQl9CgkJbmV4dF9pcnFfaW5kZXgrKzsKCX0KCgoJaWYgKC0xICE9IHNjNTIwX3BjaV9pbnRzW3Bpbl0pIHsKCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKCQkJCQkgICBzYzUyMF9wY2lfaW50c1twaW5dKTsKCX0KCVBSSU5URigiZml4dXBfaXJxOiBkZXZpY2UgJWQgcGluICVjIGlycSAlZFxuIiwKCSAgICAgICBQQ0lfREVWKGRldiksICdBJyArIHBpbiwgc2M1MjBfcGNpX2ludHNbcGluXSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgc2M1MjBfY2RwX2hvc2UgPSB7CglmaXh1cF9pcnE6IHBjaV9zYzUyMF9jZHBfZml4dXBfaXJxLAp9OwoKdm9pZCBwY2lfaW5pdF9ib2FyZCh2b2lkKQp7CglwY2lfc2M1MjBfaW5pdCgmc2M1MjBfY2RwX2hvc2UpOwp9CgoKc3RhdGljIHZvaWQgc2lsZW5jZV91YXJ0KGludCBwb3J0KQp7CglvdXRiKDAsIHBvcnQrMSk7Cn0KCnZvaWQgc2V0dXBfYWxpX3NpbyhpbnQgdWFydF9wcmltYXJ5KQp7CglhbGk1MTJ4X2luaXQoKTsKCglhbGk1MTJ4X3NldF9mZGMoQUxJX0VOQUJMRUQsIDB4M2YyLCA2LCAwKTsKCWFsaTUxMnhfc2V0X3BwKEFMSV9FTkFCTEVELCAweDI3OCwgNywgMyk7CglhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDEsIHVhcnRfcHJpbWFyeT8weDNmODoweDNlOCwgNCk7CglhbGk1MTJ4X3NldF91YXJ0KEFMSV9FTkFCTEVELCBBTElfVUFSVDIsIHVhcnRfcHJpbWFyeT8weDJmODoweDJlOCwgMyk7CglhbGk1MTJ4X3NldF9ydGMoQUxJX0RJU0FCTEVELCAwLCAwKTsKCWFsaTUxMnhfc2V0X2tiYyhBTElfRU5BQkxFRCwgMSwgMTIpOwoJYWxpNTEyeF9zZXRfY2lvKEFMSV9FTkFCTEVEKTsKCgkvKiBJckRhIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEyLCAxLCAwLCAwKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDEzLCAxLCAwLCAwKTsKCgkvKiBTU0kgY2hpcCBzZWxlY3QgcGlucyAqLwoJYWxpNTEyeF9jaW9fZnVuY3Rpb24oMTQsIDAsIDAsIDApOyAgLyogU1NJX0NTICovCglhbGk1MTJ4X2Npb19mdW5jdGlvbigxNSwgMCwgMCwgMCk7ICAvKiBTU0lfTVYgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDE2LCAwLCAwLCAwKTsgIC8qIFNTSV9TUEkjICovCgoJLyogQm9hcmQgUkVWIHBpbnMgKi8KCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIwLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIxLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIyLCAwLCAwLCAxKTsKCWFsaTUxMnhfY2lvX2Z1bmN0aW9uKDIzLCAwLCAwLCAxKTsKfQoKCi8qIHNldCB1cCB0aGUgSVNBIGJ1cyB0aW1pbmcgYW5kIHN5c3RlbSBhZGRyZXNzIG1hcHBpbmdzICovCnN0YXRpYyB2b2lkIGJ1c19pbml0KHZvaWQpCnsKCgkvKiBzZXQgdXAgdGhlIEdQIElPIHBpbnMgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9QSU9QRlMzMV8xNiwgMHhmN2ZmKTsgCS8qIHNldCB0aGUgR1BJTyBwaW4gZnVuY3Rpb24gMzEtMTYgcmVnICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfUElPUEZTMTVfMCwgMHhmZmZmKTsgIAkvKiBzZXQgdGhlIEdQSU8gcGluIGZ1bmN0aW9uIDE1LTAgcmVnICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ1NQRlMsIDB4ZjgpOyAgCQkvKiBzZXQgdGhlIENTIHBpbiBmdW5jdGlvbiAgcmVnICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQ0xLU0VMLCAweDcwKTsKCgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQQ1NSVCwgMSk7ICAgLyogc2V0IHRoZSBHUCBDUyBvZmZzZXQgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTUFcsIDMpOyAgIC8qIHNldCB0aGUgR1AgQ1MgcHVsc2Ugd2lkdGggKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUENTT0ZGLCAxKTsgIC8qIHNldCB0aGUgR1AgQ1Mgb2Zmc2V0ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRFcsIDMpOyAgICAvKiBzZXQgdGhlIFJEIHB1bHNlIHdpZHRoICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfR1BSRE9GRiwgMSk7ICAvKiBzZXQgdGhlIEdQIFJEIG9mZnNldCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JXLCAzKTsgICAgLyogc2V0IHRoZSBHUCBXUiBwdWxzZSB3aWR0aCAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0dQV1JPRkYsIDEpOyAgLyogc2V0IHRoZSBHUCBXUiBvZmZzZXQgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfQk9PVENTQ1RMLCAweDE4MjMpOwkJLyogc2V0IHVwIHRpbWluZyBvZiBCT09UQ1MgKi8KCXdyaXRlX21tY3Jfd29yZChTQzUyMF9ST01DUzFDVEwsIDB4MTgyMyk7CQkvKiBzZXQgdXAgdGltaW5nIG9mIFJPTUNTMSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JPTUNTMkNUTCwgMHgxODIzKTsJCS8qIHNldCB1cCB0aW1pbmcgb2YgUk9NQ1MyICovCgoJLyogYWRqdXN0IHRoZSBtZW1vcnkgbWFwOgoJICogYnkgZGVmYXVsdCB0aGUgZmlyc3QgMjU2TUIgKDB4MDAwMDAwMDAgLSAweDBmZmZmZmZmKSBpcyBtYXBwZWQgdG8gU0RSQU0KCSAqIGFuZCAyNTZNQiB0byAxRy0xMjhrICAoMHgxMDAwMDAwIC0gMHgzN2ZmZmZmZikgaXMgbWFwcGVkIHRvIFBDSSBtbWlvCgkgKiB3ZSBuZWVkIHRvIG1hcCAxRy0xMjhrIC0gMUcgKDB4MzgwMDAwMDAgLSAweDNmZmZmZmZmKSB0byBDUzEgKi8KCgoJLyogU1JBTSA9IEdQQ1MzIDEyOGsgQCBkMDAwMC1lZmZmZiovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMiwgIDB4NGUwMDQwMGQpOwoKCS8qIElERTAgPSBHUENTNiAxZjAtMWY3ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSMywgIDB4MzgwODAxZjApOwoKCS8qIElERTEgPSBHUENTNyAzZjYgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI0LCAgMHgzYzAwMDNmNik7CgkvKiBib290Y3MgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMiwgMHg4YmZmZTgwMCk7CgkvKiByb21jczIgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMywgMHhjYmZmZjAwMCk7CgkvKiByb21jczEgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxNCwgMHhhYmZmZjgwMCk7CgkvKiA2ODAgTEVEUyAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjE1LCAweDMwMDAwNjQwKTsKCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCAwKTsKCglhc20gKCJ3YmludmRcbiIpOyAvKiBGbHVzaCBjYWNoZSwgcmVxLiBhZnRlciBzZXR0aW5nIHRoZSB1bmNoYWNoZWQgYXR0cmlidXRlIG9uYSBQQVIgKi8KCglpZiAoQ0ZHX1VTRV9TSU9fVUFSVCkgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwsIHJlYWRfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCkgfCBVQVJUMl9ESVN8VUFSVDFfRElTKTsKCQlzZXR1cF9hbGlfc2lvKDEpOwoJfSBlbHNlIHsKCQl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMLCByZWFkX21tY3JfYnl0ZShTQzUyMF9BRERERUNDVEwpICYgfihVQVJUMl9ESVN8VUFSVDFfRElTKSk7CgkJc2V0dXBfYWxpX3NpbygwKTsKCQlzaWxlbmNlX3VhcnQoMHgzZTgpOwoJCXNpbGVuY2VfdWFydCgweDJlOCk7Cgl9Cgp9CgovKiBHUENTIHVzYWdlCiAqIEdQQ1MwICAgICAgIFBJTzI3IChOTUkpCiAqIEdQQ1MxICAgICAgIFJPTUNTMQogKiBHUENTMiAgICAgICBST01DUzIKICogR1BDUzMgICAgICAgU1JBTUNTICAgICAgIFBBUjIKICogR1BDUzQgICAgICAgdW51c2VkICAgICAgIFBBUjMKICogR1BDUzUgICAgICAgdW51c2VkICAgICAgIFBBUjQKICogR1BDUzYgICAgICAgSURFCiAqIEdQQ1M3ICAgICAgIElERQogKi8KCgovKiBwYXIgdXNhZ2U6CiAqIFBBUjAgICBsZWdhY3lfdmlkZW8KICogUEFSMSAgIFBDSSBST00gbWFwcGluZwogKiBQQVIyICAgU1JBTQogKiBQQVIzICAgSURFCiAqIFBBUjQgICBJREUKICogUEFSNSAgIGxlZ2FjeV92aWRlbwogKiBQQVI2ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjcgICBsZWdhY3lfdmlkZW8KICogUEFSOCAgIGxlZ2FjeV92aWRlbwogKiBQQVI5ICAgbGVnYWN5X3ZpZGVvCiAqIFBBUjEwICBsZWdhY3lfdmlkZW8KICogUEFSMTEgIElTQVJPTQogKiBQQVIxMiAgQk9PVENTCiAqIFBBUjEzICBST01DUzEKICogUEFSMTQgIFJPTUNTMgogKiBQQVIxNSAgUG9ydCAweDY4MCBMRUQgZGlzcGxheQogKi8KCi8qCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKICogb2YgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIHRvIHRoZSBJU0EgYnVzCiAqCiAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbWVtb3J5IGFkZHJlc3MKICogYXMgc2VlbiBieSB0aGUgaG9zdCAod2hpY2ggbWF5IHZlcnkgd2lsbCBiZSB0aGUKICogc2FtZSBhcyB0aGUgYnVzIGFkZHJlc3MpCiAqLwp1MzIgaXNhX21hcF9yb20odTMyIGJ1c19hZGRyLCBpbnQgc2l6ZSkKewoJdTMyIHBhcjsKCglQUklOVEYoImlzYV9tYXBfcm9tIGFza2VkIHRvIG1hcCAlZCBieXRlcyBhdCAleFxuIiwKCSAgICAgICBzaXplLCBidXNfYWRkcik7CgoJcGFyID0gc2l6ZTsKCWlmIChwYXIgPCAweDgwMDAwKSB7CgkJcGFyID0gMHg4MDAwMDsKCX0KCXBhciA+Pj0gMTI7CglwYXItLTsKCXBhciY9MHg3ZjsKCXBhciA8PD0gMTg7CglwYXIgfD0gKGJ1c19hZGRyPj4xMik7CglwYXIgfD0gMHg1MDAwMDAwMDsKCglQUklOVEYgKCJzZXR0aW5nIFBBUjExIHRvICV4XG4iLCBwYXIpOwoKCS8qIE1hcCByb20gMHgxMDAwMCB3aXRoIFBBUjEgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMSwgIHBhcik7CgoJcmV0dXJuIGJ1c19hZGRyOwp9CgovKgogKiB0aGlzIGZ1bmN0aW9uIHJlbW92ZWQgYW55IG1hcHBpbmcgY3JlYXRlZAogKiB3aXRoIHBjaV9nZXRfcm9tX3dpbmRvdygpCiAqLwp2b2lkIGlzYV91bm1hcF9yb20odTMyIGFkZHIpCnsKCVBSSU5URigiaXNhX3VubWFwX3JvbSBhc2tlZCB0byB1bm1hcCAleCIsIGFkZHIpOwoJaWYgKChhZGRyPj4xMikgPT0gKHJlYWRfbW1jcl9sb25nKFNDNTIwX1BBUjExKSYweDNmZmZmKSkgewoJCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMSwgMCk7CgkJUFJJTlRGKCIgZG9uZVxuIik7CgkJcmV0dXJuOwoJfQoJUFJJTlRGKCIgbm90IG91cnNcbiIpOwp9CgojaWZkZWYgQ09ORklHX1BDSQojZGVmaW5lIFBDSV9ST01fVEVNUF9TUEFDRSAweDEwMDAwCi8qCiAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKICogb2YgdGhlIHN5c3RlbSBhZGRyZXNzIHNwYWNlIHRvIHRoZSBQQ0kgYnVzLAogKiBzdWl0YWJsZSB0byBtYXAgUENJIFJPTVMgKGJ1cyBhZGRyZXNzIDwgMTZNKQogKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGhvc3QgbWVtb3J5IGFkZHJlc3MKICogd2hpY2ggc2hvdWxkIGJlIGNvbnZlcnRlZCBpbnRvIGEgYnVzIGFkZHJlc3MKICogYmVmb3JlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQQ0kgcm9tIGFkZHJlc3MKICogZGVjb2RlcgogKi8KdTMyIHBjaV9nZXRfcm9tX3dpbmRvdyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIGludCBzaXplKQp7Cgl1MzIgcGFyOwoKCXBhciA9IHNpemU7CglpZiAocGFyIDwgMHg4MDAwMCkgewoJCXBhciA9IDB4ODAwMDA7Cgl9CglwYXIgPj49IDE2OwoJcGFyLS07CglwYXImPTB4N2ZmOwoJcGFyIDw8PSAxNDsKCXBhciB8PSAoUENJX1JPTV9URU1QX1NQQUNFPj4xNik7CglwYXIgfD0gMHg3MjAwMDAwMDsKCglQUklOVEYgKCJzZXR0aW5nIFBBUjEgdG8gJXhcbiIsIHBhcik7CgoJLyogTWFwIHJvbSAweDEwMDAwIHdpdGggUEFSMSAqLwoJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEsICBwYXIpOwoKCXJldHVybiBQQ0lfUk9NX1RFTVBfU1BBQ0U7Cn0KCi8qCiAqIHRoaXMgZnVuY3Rpb24gcmVtb3ZlZCBhbnkgbWFwcGluZyBjcmVhdGVkCiAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKICovCnZvaWQgcGNpX3JlbW92ZV9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIGFkZHIpCnsKCVBSSU5URigicGNpX3JlbW92ZV9yb21fd2luZG93OiAleCIsIGFkZHIpOwoJaWYgKGFkZHIgPT0gUENJX1JPTV9URU1QX1NQQUNFKSB7CgkJd3JpdGVfbW1jcl9sb25nKFNDNTIwX1BBUjEsIDApOwoJCVBSSU5URigiIGRvbmVcbiIpOwoJCXJldHVybjsKCX0KCVBSSU5URigiIG5vdCBvdXJzXG4iKTsKCn0KCi8qCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIG9yZGVyIHRvIHByb3ZpZGUgYWNjZXMgdG8gdGhlCiAqIGxlZ2FjeSB2aWRlbyBJL08gcG9ydHMgb24gdGhlIFBDSSBidXMuCiAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gYWNjZXNzZXMgdG8gSS9PIHBvcnRzIDB4M2IwLTB4M2JiIGFuZAogKiAweDNjMC0weDNkZiBzaHVsZCByZXN1bHQgaW4gdHJhbnNhY3Rpb25zIG9uIHRoZSBQQ0kgYnVzLgogKgogKi8KaW50IHBjaV9lbmFibGVfbGVnYWN5X3ZpZGVvX3BvcnRzKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKewoJLyogTWFwIHZpZGVvIG1lbW9yeSB0byAweGEwMDAwKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIwLCAgMHg3MjAwNDAwYSk7CgoJLyogZm9yd2FyZCBhbGwgSS9PIGFjY2Vzc2VzIHRvIFBDSSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0FERERFQ0NUTCwKCQkJcmVhZF9tbWNyX2J5dGUoU0M1MjBfQUREREVDQ1RMKSB8IElPX0hPTEVfREVTVF9QQ0kpOwoKCgkvKiBzbyB3ZSBtYXAgYXdheSBhbGwgaW8gcG9ydHMgdG8gcGNpIChvbmx5IHdheSB0byBhY2Nlc3MgcGNpIGlvCgkgKiBiZWxvdyAweDQwMC4gQnV0IHRoZW4gd2UgaGF2ZSB0byBtYXAgYmFjayB0aGUgcG9ydGlvbnMgdGhhdCB3ZSBkb250CgkgKiB1c2Ugc28gdGhhdCB0aGUgZ2VuZXJhdGUgY3ljbGVzIG9uIHRoZSBHUElPIGJ1cyB3aGVyZSB0aGUgc2lvIGFuZAoJICogSVNBIHNsb3RzIGFyZSBjb25uZWN0ZWQsIHRoaXMgcmVxdXJlIHRoZSB1c2Ugb2Ygc2V2ZXJhbCBQQVIgcmVnaXN0ZXJzCgkgKi8KCgkvKiBicmluZyAweDEwMCAtIDB4MWVmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjUgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI1LCAweDMwZWYwMTAwKTsKCgkvKiBJREUgdXNlIDFmMC0xZjcgKi8KCgkvKiBicmluZyAweDFmOCAtIDB4MmY3IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjYgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVI2LCAweDMwZmYwMWY4KTsKCgkvKiBjb20yIHVzZSAyZjgtMmZmICovCgoJLyogYnJpbmcgMHgzMDAgLSAweDNhZiBiYWNrIHRvIElTQSB1c2luZyBQQVI3ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSNywgMHgzMGFmMDMwMCk7CgoJLyogdmdhIHVzZSAzYjAtM2JiICovCgoJLyogYnJpbmcgMHgzYmMgLSAweDNiZiBiYWNrIHRvIElTQSB1c2luZyBQQVI4ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSOCwgMHgzMDAzMDNiYyk7CgoJLyogdmdhIHVzZSAzYzAtM2RmICovCgoJLyogYnJpbmcgMHgzZTAgLSAweDNmNSBiYWNrIHRvIElTQSB1c2luZyBQQVI5ICovCgl3cml0ZV9tbWNyX2xvbmcoU0M1MjBfUEFSOSwgMHgzMDE1MDNlMCk7CgoJLyogaWRlIHVzZSAzZjYgKi8KCgkvKiBicmluZyAweDNmNyAgYmFjayB0byBJU0EgdXNpbmcgUEFSMTAgKi8KCXdyaXRlX21tY3JfbG9uZyhTQzUyMF9QQVIxMCwgMHgzMDAwMDNmNyk7CgoJLyogY29tMSB1c2UgM2Y4LTNmZiAqLwoKCXJldHVybiAwOwp9CiNlbmRpZgoKLyoKICogTWlzY2VsYW5lb3VzIHBsYXRmb3JtIGRlcGVuZGVudCBpbml0aWFsaXNhdGlvbnMKICovCgppbnQgYm9hcmRfaW5pdCh2b2lkKQp7CglERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCglpbml0X3NjNTIwKCk7CglidXNfaW5pdCgpOwoJaXJxX2luaXQoKTsKCgkvKiBtYXggZHJpdmUgY3VycmVudCBvbiBTRFJBTSAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0RTQ1RMLCAweDAxMDApOwoKCS8qIGVudGVyIGRlYnVnIG1vZGUgYWZ0ZXIgbmV4dCByZXNldCAob25seSBpZiBqdW1wZXIgaXMgYWxzbyBzZXQpICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfUkVTQ0ZHLCAweDA4KTsKCS8qIGNvbmZpZ3VyZSB0aGUgc29mdHdhcmUgdGltZXIgdG8gMzMuMzMzTUh6ICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1dUTVJDRkcsIDApOwoJZ2QtPmJ1c19jbGsgPSAzMzMzMzAwMDsKCglyZXR1cm4gMDsKfQoKaW50IGRyYW1faW5pdCh2b2lkKQp7Cglpbml0X3NjNTIwX2RyYW0oKTsKCXJldHVybiAwOwp9Cgp2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyhpbnQgdmFsKQp7CglvdXRiKHZhbCYweGZmLCAweDgwKTsKCW91dGIoKHZhbCYweGZmMDApPj44LCAweDY4MCk7Cn0KCgppbnQgbGFzdF9zdGFnZV9pbml0KHZvaWQpCnsKCWludCBtaW5vcjsKCWludCBtYWpvcjsKCgltYWpvciA9IG1pbm9yID0gMDsKCW1ham9yIHw9IGFsaTUxMnhfY2lvX2luKDIzKT8yOjA7CgltYWpvciB8PSBhbGk1MTJ4X2Npb19pbigyMik/MTowOwoJbWlub3IgfD0gYWxpNTEyeF9jaW9faW4oMjEpPzI6MDsKCW1pbm9yIHw9IGFsaTUxMnhfY2lvX2luKDIwKT8xOjA7CgoJcHJpbnRmKCJBTUQgU0M1MjAgQ0RQIHJldmlzaW9uICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwoKCXJldHVybiAwOwp9CgoKdm9pZCBzc2lfY2hpcF9zZWxlY3QoaW50IGRldikKewoKCS8qIFNwdW5rIGJvYXJkOiBTUEkgRUVQUk9NIGlzIGFjdGl2ZS1sb3csIE1XIEVFUFJPTSBhbmQgQVVYIGFyZSBhY3RpdmUgaGlnaCAqLwoJc3dpdGNoIChkZXYpIHsKCWNhc2UgMTogLyogU1BJIEVFUFJPTSAqLwoJCWFsaTUxMnhfY2lvX291dCgxNiwgMCk7CgkJYnJlYWs7CgoJY2FzZSAyOiAvKiBNVyBFRVBST00gKi8KCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDEpOwoJCWJyZWFrOwoKCWNhc2UgMzogLyogQVVYICovCgkJYWxpNTEyeF9jaW9fb3V0KDE0LCAxKTsKCQlicmVhazsKCgljYXNlIDA6CgkJYWxpNTEyeF9jaW9fb3V0KDE2LCAxKTsKCQlhbGk1MTJ4X2Npb19vdXQoMTUsIDApOwoJCWFsaTUxMnhfY2lvX291dCgxNCwgMCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGYoIklsbGVnYWwgU1NJIGRldmljZSByZXF1ZXN0ZWQ6ICVkXG4iLCBkZXYpOwoJfQp9CgoKdm9pZCBzcGlfaW5pdF9mKHZvaWQpCnsKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSQoJc3BpX2VlcHJvbV9wcm9iZSgxKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU0M1MjBfQ0RQX1VTRV9NVwoJbXdfZWVwcm9tX3Byb2JlKDIpOwojZW5kaWYKfQoKc3NpemVfdCBzcGlfcmVhZCh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV9yZWFkKDEsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX01XCglyZXMgPSBtd19lZXByb21fcmVhZCgyLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCglyZXR1cm4gcmVzOwp9Cgpzc2l6ZV90IHNwaV93cml0ZSh1Y2hhciAqYWRkciwgaW50IGFsZW4sIHVjaGFyICpidWZmZXIsIGludCBsZW4pCnsKCWludCBvZmZzZXQ7CglpbnQgaTsKCXNzaXplX3QgcmVzOwoKCW9mZnNldCA9IDA7Cglmb3IgKGk9MDtpPGFsZW47aSsrKSB7CgkJb2Zmc2V0IDw8PSA4OwoJCW9mZnNldCB8PSBhZGRyW2ldOwoJfQoKI2lmZGVmIENPTkZJR19TQzUyMF9DRFBfVVNFX1NQSQoJcmVzID0gc3BpX2VlcHJvbV93cml0ZSgxLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU0M1MjBfQ0RQX1VTRV9NVwoJcmVzID0gbXdfZWVwcm9tX3dyaXRlKDIsIG9mZnNldCwgYnVmZmVyLCBsZW4pOwojZW5kaWYKCXJldHVybiByZXM7Cn0K