LyoKICogRE9TIGRldmljZXMKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAibXNkb3MuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgImRvc2V4ZS5oIgojaW5jbHVkZSAiY2FsbGJhY2suaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCiNpbmNsdWRlICJwc2hwYWNrMS5oIgoKdHlwZWRlZiBzdHJ1Y3QgewogIEJZVEUgbGptcDE7CiAgUk1DQlBST0Mgc3RyYXRlZ3k7CiAgQllURSBsam1wMjsKICBSTUNCUFJPQyBpbnRlcnJ1cHQ7Cn0gV0lORURFVl9USFVOSzsKCnR5cGVkZWYgc3RydWN0IHsKICBCWVRFIHNpemU7IC8qIGxlbmd0aCBvZiBoZWFkZXIgKyBkYXRhICovCiAgQllURSB1bml0OyAvKiB1bml0IChibG9jayBkZXZpY2VzIG9ubHkpICovCiAgQllURSBjb21tYW5kOwogIFdPUkQgc3RhdHVzOwogIEJZVEUgcmVzZXJ2ZWRbOF07Cn0gUkVRVUVTVF9IRUFERVI7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgUkVRVUVTVF9IRUFERVIgaGRyOwogIEJZVEUgbWVkaWE7IC8qIG1lZGlhIGRlc2NyaXB0b3IgZnJvbSBCUEIgKi8KICBTRUdQVFIgYnVmZmVyOwogIFdPUkQgY291bnQ7IC8qIGJ5dGUvc2VjdG9yIGNvdW50ICovCiAgV09SRCBzZWN0b3I7IC8qIHN0YXJ0aW5nIHNlY3RvciAoYmxvY2sgZGV2aWNlcykgKi8KICBEV09SRCB2b2x1bWU7IC8qIHZvbHVtZSBJRCAoYmxvY2sgZGV2aWNlcykgKi8KfSBSRVFfSU87Cgp0eXBlZGVmIHN0cnVjdCB7CiAgUkVRVUVTVF9IRUFERVIgaGRyOwogIEJZVEUgZGF0YTsKfSBSRVFfU0FGRUlOUFVUOwoKI2luY2x1ZGUgInBvcHBhY2suaCIKCiNkZWZpbmUgQ09OX0JVRkZFUiAxMjgKCmVudW0gc3RyYXRlZ3kgeyBTWVNURU1fU1RSQVRFR1lfTlVMLCBTWVNURU1fU1RSQVRFR1lfQ09OLCBOQl9TWVNURU1fU1RSQVRFR0lFUyB9OwoKc3RhdGljIHZvaWQgKnN0cmF0ZWd5X2RhdGFbTkJfU1lTVEVNX1NUUkFURUdJRVNdOwoKI2RlZmluZSBOT05FWFQgKChEV09SRCktMSkKCiNkZWZpbmUgQVRUUl9TVERJTiAgICAgMHgwMDAxCiNkZWZpbmUgQVRUUl9TVERPVVQgICAgMHgwMDAyCiNkZWZpbmUgQVRUUl9OVUwgICAgICAgMHgwMDA0CiNkZWZpbmUgQVRUUl9DTE9DSyAgICAgMHgwMDA4CiNkZWZpbmUgQVRUUl9GQVNUQ09OICAgMHgwMDEwCiNkZWZpbmUgQVRUUl9SQVcgICAgICAgMHgwMDIwCiNkZWZpbmUgQVRUUl9OT1RFT0YgICAgMHgwMDQwCiNkZWZpbmUgQVRUUl9ERVZJQ0UgICAgMHgwMDgwCiNkZWZpbmUgQVRUUl9SRU1PVkFCTEUgMHgwODAwCiNkZWZpbmUgQVRUUl9OT05JQk0gICAgMHgyMDAwIC8qIGJsb2NrIGRldmljZXMgKi8KI2RlZmluZSBBVFRSX1VOVElMQlVTWSAweDIwMDAgLyogY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQVRUUl9JT0NUTCAgICAgMHg0MDAwCiNkZWZpbmUgQVRUUl9DSEFSICAgICAgMHg4MDAwCgojZGVmaW5lIENNRF9JTklUICAgICAgIDAKI2RlZmluZSBDTURfTUVESUFDSEVDSyAxIC8qIGJsb2NrIGRldmljZXMgKi8KI2RlZmluZSBDTURfQlVJTERCUEIgICAyIC8qIGJsb2NrIGRldmljZXMgKi8KI2RlZmluZSBDTURfSU5JT0NUTCAgICAzCiNkZWZpbmUgQ01EX0lOUFVUICAgICAgNCAvKiByZWFkIGRhdGEgKi8KI2RlZmluZSBDTURfU0FGRUlOUFVUICA1IC8qICJub24tZGVzdHJ1Y3RpdmUgaW5wdXQgbm8gd2FpdCIsIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9JTlNUQVRVUyAgIDYgLyogY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX0lORkxVU0ggICAgNyAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfT1VUUFVUICAgICA4IC8qIHdyaXRlIGRhdGEgKi8KI2RlZmluZSBDTURfU0FGRU9VVFBVVCA5IC8qIHdyaXRlIGRhdGEgd2l0aCB2ZXJpZnkgKi8KI2RlZmluZSBDTURfT1VUU1RBVFVTIDEwIC8qIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9PVVRGTFVTSCAgMTEgLyogY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX09VVElPQ1RMICAxMgojZGVmaW5lIENNRF9ERVZPUEVOICAgMTMKI2RlZmluZSBDTURfREVWQ0xPU0UgIDE0CiNkZWZpbmUgQ01EX1JFTU9WQUJMRSAxNSAvKiBibG9jayBkZXZpY2VzICovCiNkZWZpbmUgQ01EX1VOVElMQlVTWSAxNiAvKiBvdXRwdXQgdW50aWwgYnVzeSAqLwoKI2RlZmluZSBTVEFUX01BU0sgIDB4MDBGRgojZGVmaW5lIFNUQVRfRE9ORSAgMHgwMTAwCiNkZWZpbmUgU1RBVF9CVVNZICAweDAyMDAKI2RlZmluZSBTVEFUX0VSUk9SIDB4ODAwMAoKI2RlZmluZSBMSk1QIDB4ZWEKCgovKiBwcm90b3R5cGVzICovCnN0YXRpYyB2b2lkIFdJTkFQSSBudWxfc3RyYXRlZ3koQ09OVEVYVDg2KmN0eCk7CnN0YXRpYyB2b2lkIFdJTkFQSSBudWxfaW50ZXJydXB0KENPTlRFWFQ4NipjdHgpOwpzdGF0aWMgdm9pZCBXSU5BUEkgY29uX3N0cmF0ZWd5KENPTlRFWFQ4NipjdHgpOwpzdGF0aWMgdm9pZCBXSU5BUEkgY29uX2ludGVycnVwdChDT05URVhUODYqY3R4KTsKCi8qIGRldmljZXMgKi8KdHlwZWRlZiBzdHJ1Y3QgCnsKICAgIGNoYXIgbmFtZVs4XTsKICAgIFdPUkQgYXR0cjsKICAgIFJNQ0JQUk9DIHN0cmF0ZWd5OwogICAgUk1DQlBST0MgaW50ZXJydXB0OwogICAgCn0gV0lORURFVjsKCnN0YXRpYyBXSU5FREVWIGRldnNbXSA9IAp7CiAgeyAiTlVMICAgICAiLAogICAgQVRUUl9DSEFSfEFUVFJfTlVMfEFUVFJfREVWSUNFLAogICAgbnVsX3N0cmF0ZWd5LCBudWxfaW50ZXJydXB0IH0sCgogIHsgIkNPTiAgICAgIiwKICAgIEFUVFJfQ0hBUnxBVFRSX1NURElOfEFUVFJfU1RET1VUfEFUVFJfRkFTVENPTnxBVFRSX05PVEVPRnxBVFRSX0RFVklDRSwKICAgIGNvbl9zdHJhdGVneSwgY29uX2ludGVycnVwdCB9Cn07CgojZGVmaW5lIE5SX0RFVlMgKHNpemVvZihkZXZzKS9zaXplb2YoV0lORURFVikpCgovKiBET1MgZGF0YSBzZWdtZW50ICovCnR5cGVkZWYgc3RydWN0CnsKICAgIERPU19MSVNUT0ZMSVNUUyAgICBsb2w7CiAgICBET1NfREVWSUNFX0hFQURFUiAgZGV2W05SX0RFVlMtMV07CiAgICBXSU5FREVWX1RIVU5LICAgICAgdGh1bmtbTlJfREVWU107CiAgICBSRVFfSU8gICAgICAgICAgICAgcmVxOwogICAgQllURSAgICAgICAgICAgICAgIGJ1ZmZlcltDT05fQlVGRkVSXTsKCn0gRE9TX0RBVEFTRUc7CgojZGVmaW5lIERPU19EQVRBU0VHX09GRih4eHgpIEZJRUxEX09GRlNFVChET1NfREFUQVNFRywgeHh4KQoKRFdPUkQgRE9TX0xPTFNlZzsKCgovKiB0aGUgZGV2aWNlIGltcGxlbWVudGF0aW9ucyAqLwpzdGF0aWMgdm9pZCBkb19scmV0KENPTlRFWFQ4NipjdHgpCnsKICBXT1JEICpzdGFjayA9IENUWF9TRUdfT0ZGX1RPX0xJTihjdHgsIGN0eC0+U2VnU3MsIGN0eC0+RXNwKTsKCiAgY3R4LT5FaXAgICA9ICooc3RhY2srKyk7CiAgY3R4LT5TZWdDcyA9ICooc3RhY2srKyk7CiAgY3R4LT5Fc3AgICs9IDIqc2l6ZW9mKFdPUkQpOwp9CgpzdGF0aWMgdm9pZCBkb19zdHJhdGVneShDT05URVhUODYqY3R4LCBpbnQgaWQsIGludCBleHRyYSkKewogIFJFUVVFU1RfSEVBREVSICpoZHIgPSBDVFhfU0VHX09GRl9UT19MSU4oY3R4LCBjdHgtPlNlZ0VzLCBjdHgtPkVieCk7CiAgdm9pZCAqKmhkcl9wdHIgPSBzdHJhdGVneV9kYXRhW2lkXTsKCiAgaWYgKCFoZHJfcHRyKSB7CiAgICBoZHJfcHRyID0gY2FsbG9jKDEsc2l6ZW9mKHZvaWQgKikrZXh0cmEpOwogICAgc3RyYXRlZ3lfZGF0YVtpZF0gPSBoZHJfcHRyOwogIH0KICAqaGRyX3B0ciA9IGhkcjsKICBkb19scmV0KGN0eCk7Cn0KCnN0YXRpYyBSRVFVRVNUX0hFQURFUiAqIGdldF9oZHIoaW50IGlkLCB2b2lkKipleHRyYSkKewogIHZvaWQgKipoZHJfcHRyID0gc3RyYXRlZ3lfZGF0YVtpZF07CiAgaWYgKGV4dHJhKQogICAgKmV4dHJhID0gaGRyX3B0ciA/ICh2b2lkKikoaGRyX3B0cisxKSA6ICh2b2lkICopTlVMTDsKICByZXR1cm4gaGRyX3B0ciA/ICpoZHJfcHRyIDogKHZvaWQgKilOVUxMOwp9CgpzdGF0aWMgdm9pZCBXSU5BUEkgbnVsX3N0cmF0ZWd5KENPTlRFWFQ4NipjdHgpCnsKICBkb19zdHJhdGVneShjdHgsIFNZU1RFTV9TVFJBVEVHWV9OVUwsIDApOwp9CgpzdGF0aWMgdm9pZCBXSU5BUEkgbnVsX2ludGVycnVwdChDT05URVhUODYqY3R4KQp7CiAgUkVRVUVTVF9IRUFERVIgKmhkciA9IGdldF9oZHIoU1lTVEVNX1NUUkFURUdZX05VTCwgTlVMTCk7CiAgLyogZWF0IGV2ZXJ5dGhpbmcgYW5kIHJlY3ljbGUgbm90aGluZyAqLwogIHN3aXRjaCAoaGRyLT5jb21tYW5kKSB7CiAgY2FzZSBDTURfSU5QVVQ6CiAgICAoKFJFUV9JTyopaGRyKS0+Y291bnQgPSAwOwogICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICBicmVhazsKICBjYXNlIENNRF9TQUZFSU5QVVQ6CiAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORXxTVEFUX0JVU1k7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgfQogIGRvX2xyZXQoY3R4KTsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIGNvbl9zdHJhdGVneShDT05URVhUODYqY3R4KQp7CiAgZG9fc3RyYXRlZ3koY3R4LCBTWVNURU1fU1RSQVRFR1lfQ09OLCBzaXplb2YoaW50KSk7Cn0KCnN0YXRpYyB2b2lkIFdJTkFQSSBjb25faW50ZXJydXB0KENPTlRFWFQ4NipjdHgpCnsKICBpbnQgKnNjYW47CiAgUkVRVUVTVF9IRUFERVIgKmhkciA9IGdldF9oZHIoU1lTVEVNX1NUUkFURUdZX0NPTiwodm9pZCAqKikmc2Nhbik7CiAgQklPU0RBVEEgKmJpb3MgPSBET1NNRU1fQmlvc0RhdGEoKTsKICBXT1JEIEN1ck9mcyA9IGJpb3MtPk5leHRLYmRDaGFyUHRyOwogIERPU19MSVNUT0ZMSVNUUyAqbG9sID0gRE9TTUVNX0xPTCgpOwogIERPU19EQVRBU0VHICpkYXRhc2VnID0gKERPU19EQVRBU0VHICopbG9sOwogIEJZVEUgKmxpbmVidWZmZXIgPSBkYXRhc2VnLT5idWZmZXI7CiAgQllURSAqY3VyYnVmZmVyID0gKGxvbC0+b2Zmc191bnJlYWRfQ09OKSA/CiAgICAoKChCWVRFKilkYXRhc2VnKSArIGxvbC0+b2Zmc191bnJlYWRfQ09OKSA6IChCWVRFKilOVUxMOwogIERPU19ERVZJQ0VfSEVBREVSICpjb24gPSBkYXRhc2VnLT5kZXY7CgogIHN3aXRjaCAoaGRyLT5jb21tYW5kKSB7CiAgY2FzZSBDTURfSU5QVVQ6CiAgICB7CiAgICAgIFJFUV9JTyAqaW8gPSAoUkVRX0lPICopaGRyOwogICAgICBXT1JEIGNvdW50ID0gaW8tPmNvdW50LCBsZW4gPSAwOwogICAgICBCWVRFICpidWZmZXIgPSBDVFhfU0VHX09GRl9UT19MSU4oY3R4LAoJCQkJCVNFTEVDVE9ST0YoaW8tPmJ1ZmZlciksCgkJCQkJKERXT1JEKU9GRlNFVE9GKGlvLT5idWZmZXIpKTsKCiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9CVVNZOwogICAgICAvKiBmaXJzdCwgY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgZGF0YSBpbiBsaW5lIGJ1ZmZlciAqLwogICAgICBpZiAoY3VyYnVmZmVyKSB7CgkvKiB5ZXAsIGNvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KCUJZVEUgZGF0YSA9IDA7Cgl3aGlsZSAoKGxlbjxjb3VudCkgJiYgKGRhdGEgIT0gJ1xyJykpIHsKCSAgZGF0YSA9ICpjdXJidWZmZXIrKzsKCSAgYnVmZmVyW2xlbisrXSA9IGRhdGE7Cgl9CglpZiAoZGF0YSA9PSAnXHInKSB7CgkgIC8qIGxpbmUgYnVmZmVyIGVtcHRpZWQgKi8KCSAgbG9sLT5vZmZzX3VucmVhZF9DT04gPSAwOwoJICBjdXJidWZmZXIgPSBOVUxMOwoJICAvKiBpZiB3ZSdyZSBub3QgaW4gcmF3IG1vZGUsIGNhbGwgaXQgYSBkYXkqLwoJICBpZiAoIShjb24tPmF0dHIgJiBBVFRSX1JBVykpIHsKCSAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKCSAgICBpby0+Y291bnQgPSBsZW47CgkgICAgYnJlYWs7CgkgIH0KCX0gZWxzZSB7CgkgIC8qIHN0aWxsIHNvbWUgZGF0YSBsZWZ0ICovCgkgIGxvbC0+b2Zmc191bnJlYWRfQ09OID0gY3VyYnVmZmVyIC0gKEJZVEUqKWxvbDsKCSAgLyogYnV0IGJ1ZmZlciB3YXMgZmlsbGVkLCB3ZSdyZSBkb25lICovCgkgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwoJICBpby0+Y291bnQgPSBsZW47CgkgIGJyZWFrOwoJfQogICAgICB9CgogICAgICAvKiBpZiB3ZSdyZSBpbiByYXcgbW9kZSwgd2UganVzdCBuZWVkIHRvIGZpbGwgdGhlIGJ1ZmZlciAqLwogICAgICBpZiAoY29uLT5hdHRyICYgQVRUUl9SQVcpIHsKCXdoaWxlIChsZW48Y291bnQpIHsKCSAgV09SRCBkYXRhOwoKCSAgLyogZG8gd2UgaGF2ZSBhIHdhaXRpbmcgc2NhbmNvZGU/ICovCgkgIGlmICgqc2NhbikgewoJICAgIC8qIHllcywgc3RvcmUgc2NhbmNvZGUgaW4gYnVmZmVyICovCgkgICAgYnVmZmVyW2xlbisrXSA9ICpzY2FuOwoJICAgICpzY2FuID0gMDsKCSAgICBpZiAobGVuPT1jb3VudCkgYnJlYWs7CgkgIH0KCgkgIC8qIGNoZWNrIGZvciBuZXcga2V5Ym9hcmQgaW5wdXQgKi8KCSAgd2hpbGUgKEN1ck9mcyA9PSBiaW9zLT5GaXJzdEtiZENoYXJQdHIpIHsKCSAgICAvKiBubyBpbnB1dCBhdmFpbGFibGUgeWV0LCBzbyB3YWl0Li4uICovCgkgICAgRG9zdm0uV2FpdCggLTEsIDAgKTsKCSAgfQoJICAvKiByZWFkIGZyb20ga2V5Ym9hcmQgcXVldWUgKGNhbGwgaW50MTY/KSAqLwoJICBkYXRhID0gKChXT1JEKiliaW9zKVtDdXJPZnNdOwoJICBDdXJPZnMgKz0gMjsKCSAgaWYgKEN1ck9mcyA+PSBiaW9zLT5LYmRCdWZmZXJFbmQpIEN1ck9mcyA9IGJpb3MtPktiZEJ1ZmZlclN0YXJ0OwoJICBiaW9zLT5OZXh0S2JkQ2hhclB0ciA9IEN1ck9mczsKCSAgLyogaWYgaXQncyBhbiBleHRlbmRlZCBrZXksIHNhdmUgc2NhbmNvZGUgKi8KCSAgaWYgKExPQllURShkYXRhKSA9PSAwKSAqc2NhbiA9IEhJQllURShkYXRhKTsKCSAgLyogc3RvcmUgQVNDSUkgY2hhciBpbiBidWZmZXIgKi8KCSAgYnVmZmVyW2xlbisrXSA9IExPQllURShkYXRhKTsKCX0KICAgICAgfSBlbHNlIHsKCS8qIHdlJ3JlIG5vdCBpbiByYXcgbW9kZSwgc28gd2UgbmVlZCB0byBkbyBsaW5lIGlucHV0Li4uICovCgl3aGlsZSAoVFJVRSkgewoJICBXT1JEIGRhdGE7CgkgIC8qIGNoZWNrIGZvciBuZXcga2V5Ym9hcmQgaW5wdXQgKi8KCSAgd2hpbGUgKEN1ck9mcyA9PSBiaW9zLT5GaXJzdEtiZENoYXJQdHIpIHsKCSAgICAvKiBubyBpbnB1dCBhdmFpbGFibGUgeWV0LCBzbyB3YWl0Li4uICovCgkgICAgRG9zdm0uV2FpdCggLTEsIDAgKTsKCSAgfQoJICAvKiByZWFkIGZyb20ga2V5Ym9hcmQgcXVldWUgKGNhbGwgaW50MTY/KSAqLwoJICBkYXRhID0gKChXT1JEKiliaW9zKVtDdXJPZnNdOwoJICBDdXJPZnMgKz0gMjsKCSAgaWYgKEN1ck9mcyA+PSBiaW9zLT5LYmRCdWZmZXJFbmQpIEN1ck9mcyA9IGJpb3MtPktiZEJ1ZmZlclN0YXJ0OwoJICBiaW9zLT5OZXh0S2JkQ2hhclB0ciA9IEN1ck9mczsKCgkgIGlmIChMT0JZVEUoZGF0YSkgPT0gJ1xyJykgewoJICAgIC8qIGl0J3MgdGhlIHJldHVybiBrZXksIHdlJ3JlIGRvbmUgKi8KCSAgICBsaW5lYnVmZmVyW2xlbisrXSA9IExPQllURShkYXRhKTsKCSAgICBicmVhazsKCSAgfQoJICBlbHNlIGlmIChMT0JZVEUoZGF0YSkgPj0gJyAnKSB7CgkgICAgLyogYSBjaGFyYWN0ZXIgKi8KCSAgICBpZiAoKGxlbisxKTxDT05fQlVGRkVSKSB7CgkgICAgICBsaW5lYnVmZmVyW2xlbl0gPSBMT0JZVEUoZGF0YSk7CgkgICAgICBXcml0ZUZpbGUoR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSwgJmxpbmVidWZmZXJbbGVuKytdLCAxLCBOVUxMLCBOVUxMKTsKCSAgICB9CgkgICAgLyogZWxzZSBiZWVwLCBidXQgSSBkb24ndCBsaWtlIG5vaXNlICovCgkgIH0KCSAgZWxzZSBzd2l0Y2ggKExPQllURShkYXRhKSkgewoJICBjYXNlICdcYic6CgkgICAgaWYgKGxlbj4wKSB7CgkgICAgICBsZW4tLTsKCSAgICAgIFdyaXRlRmlsZShHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLCAiXGIgXGIiLCAzLCBOVUxMLCBOVUxMKTsKCSAgICB9CgkgICAgYnJlYWs7CgkgIH0KCX0KCWlmIChsZW4gPiBjb3VudCkgewoJICAvKiBzYXZlIHJlc3Qgb2YgbGluZSBmb3IgbGF0ZXIgKi8KCSAgbG9sLT5vZmZzX3VucmVhZF9DT04gPSBsaW5lYnVmZmVyIC0gKEJZVEUqKWxvbCArIGNvdW50OwoJICBsZW4gPSBjb3VudDsKCX0KCW1lbWNweShidWZmZXIsIGxpbmVidWZmZXIsIGxlbik7CiAgICAgIH0KICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICAgIGlvLT5jb3VudCA9IGxlbjsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgQ01EX1NBRkVJTlBVVDoKICAgIGlmIChjdXJidWZmZXIpIHsKICAgICAgLyogc29tZSBsaW5lIGlucHV0IHdhaXRpbmcgKi8KICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICAgICgoUkVRX1NBRkVJTlBVVCopaGRyKS0+ZGF0YSA9ICpjdXJidWZmZXI7CiAgICB9CiAgICBlbHNlIGlmIChjb24tPmF0dHIgJiBBVFRSX1JBVykgewogICAgICBpZiAoQ3VyT2ZzID09IGJpb3MtPkZpcnN0S2JkQ2hhclB0cikgewoJLyogbm8gaW5wdXQgKi8KCWhkci0+c3RhdHVzID0gU1RBVF9ET05FfFNUQVRfQlVTWTsKICAgICAgfSBlbHNlIHsKCS8qIHNvbWUga2V5Ym9hcmQgaW5wdXQgd2FpdGluZyAqLwoJaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CgkoKFJFUV9TQUZFSU5QVVQqKWhkciktPmRhdGEgPSAoKEJZVEUqKWJpb3MpW0N1ck9mc107CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8qIG5vIGxpbmUgaW5wdXQgKi8KICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkV8U1RBVF9CVVNZOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSBDTURfSU5TVEFUVVM6CiAgICBpZiAoY3VyYnVmZmVyKSB7CiAgICAgIC8qIHdlIGhhdmUgZGF0YSAqLwogICAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICAgIH0KICAgIGVsc2UgaWYgKGNvbi0+YXR0ciAmIEFUVFJfUkFXKSB7CiAgICAgIGlmIChDdXJPZnMgPT0gYmlvcy0+Rmlyc3RLYmRDaGFyUHRyKSB7CgkvKiBubyBpbnB1dCAqLwoJaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkV8U1RBVF9CVVNZOwogICAgICB9IGVsc2UgewoJLyogc29tZSBrZXlib2FyZCBpbnB1dCB3YWl0aW5nICovCgloZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLyogbm8gbGluZSBpbnB1dCAqLwogICAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORXxTVEFUX0JVU1k7CiAgICB9CgogICAgYnJlYWs7CiAgY2FzZSBDTURfSU5GTFVTSDoKICAgIC8qIGZsdXNoIGxpbmUgYW5kIGtleWJvYXJkIHF1ZXVlICovCiAgICBsb2wtPm9mZnNfdW5yZWFkX0NPTiA9IDA7CiAgICBiaW9zLT5OZXh0S2JkQ2hhclB0ciA9IGJpb3MtPkZpcnN0S2JkQ2hhclB0cjsKICAgIGJyZWFrOwogIGNhc2UgQ01EX09VVFBVVDoKICBjYXNlIENNRF9TQUZFT1VUUFVUOgogICAgewogICAgICBSRVFfSU8gKmlvID0gKFJFUV9JTyAqKWhkcjsKICAgICAgQllURSAqYnVmZmVyID0gQ1RYX1NFR19PRkZfVE9fTElOKGN0eCwKCQkJCQlTRUxFQ1RPUk9GKGlvLT5idWZmZXIpLAoJCQkJCShEV09SRClPRkZTRVRPRihpby0+YnVmZmVyKSk7CiAgICAgIERXT1JEIHJlc3VsdCA9IDA7CiAgICAgIFdyaXRlRmlsZShHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLCBidWZmZXIsIGlvLT5jb3VudCwgJnJlc3VsdCwgTlVMTCk7CiAgICAgIGlvLT5jb3VudCA9IHJlc3VsdDsKICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICB9CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgfQogIGRvX2xyZXQoY3R4KTsKfQoKc3RhdGljIHZvaWQgSW5pdExpc3RPZkxpc3RzKERPU19MSVNUT0ZMSVNUUyAqRE9TX0xPTCkKewovKgpPdXRwdXQgb2YgRE9TIDYuMjI6CgowMTMzOjAwMjAgICAgICAgICAgICAgICAgICAgIDZBIDEzLTMzIDAxIENDIDAwIDMzIDAxIDU5IDAwICAgICAgICAgai4zLi4uMy5ZLgowMTMzOjAwMzAgIDcwIDAwIDAwIDAwIDcyIDAyIDAwIDAyLTZEIDAwIDMzIDAxIDAwIDAwIDJFIDA1ICAgcC4uLnIuLi5tLjMuLi4uLgowMTMzOjAwNDAgIDAwIDAwIEZDIDA0IDAwIDAwIDAzIDA4LTkyIDIxIDExIEUwIDA0IDgwIEM2IDBEICAgLi4uLi4uLi4uIS4uLi4uLgowMTMzOjAwNTAgIENDIDBEIDRFIDU1IDRDIDIwIDIwIDIwLTIwIDIwIDAwIDAwIDAwIDAwIDAwIDAwICAgLi5OVUwgICAgIC4uLi4uLgowMTMzOjAwNjAgIDAwIDRCIEJBIEMxIDA2IDE0IDAwIDAwLTAwIDAzIDAxIDAwIDA0IDcwIENFIEZGICAgLksuLi4uLi4uLi4uLnAuLgowMTMzOjAwNzAgIEZGIDAwIDAwIDAwIDAwIDAwIDAwIDAwLTAwIDAxIDAwIDAwIDBEIDA1IDAwIDAwICAgLi4uLi4uLi4uLi4uLi4uLgowMTMzOjAwODAgIDAwIEZGIEZGIDAwIDAwIDAwIDAwIEZFLTAwIDAwIEY4IDAzIEZGIDlGIDcwIDAyICAgLi4uLi4uLi4uLi4uLi5wLgowMTMzOjAwOTAgIEQwIDQ0IEM4IEZEIEQ0IDQ0IEM4IEZELUQ0IDQ0IEM4IEZEIEQwIDQ0IEM4IEZEICAgLkQuLi5ELi4uRC4uLkQuLgowMTMzOjAwQTAgIEQwIDQ0IEM4IEZEIEQwIDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkQuLi5ECiovCiAgRE9TX0xPTC0+Q1hfSW50MjFfNWUwMQkJPSAweDA7CiAgRE9TX0xPTC0+TFJVX2NvdW50X0ZDQl9jYWNoZQk9IDB4MDsKICBET1NfTE9MLT5MUlVfY291bnRfRkNCX29wZW4JCT0gMHgwOwogIERPU19MT0wtPk9FTV9mdW5jX2hhbmRsZXIJCT0gLTE7IC8qIG5vdCBhdmFpbGFibGUgKi8KICBET1NfTE9MLT5JTlQyMV9vZmZzZXQJCT0gMHgwOwogIERPU19MT0wtPnNoYXJpbmdfcmV0cnlfY291bnQJPSAzOwogIERPU19MT0wtPnNoYXJpbmdfcmV0cnlfZGVsYXkJPSAxOwogIERPU19MT0wtPnB0cl9kaXNrX2J1ZgkJPSAweDA7CiAgRE9TX0xPTC0+b2Zmc191bnJlYWRfQ09OCQk9IDB4MDsKICBET1NfTE9MLT5zZWdfZmlyc3RfTUNCCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfZmlyc3RfRFBCCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfZmlyc3RfU3lzRmlsZVRhYmxlCT0gMHgwOwogIERPU19MT0wtPnB0cl9jbG9ja19kZXZfaGRyCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfQ09OX2Rldl9oZHIJCT0gMHgwOwogIERPU19MT0wtPm1heF9ieXRlX3Blcl9zZWMJCT0gNTEyOwogIERPU19MT0wtPnB0cl9kaXNrX2J1Zl9pbmZvCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfYXJyYXlfQ0RTCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfc3lzX0ZDQgkJPSAweDA7CiAgRE9TX0xPTC0+bnJfcHJvdGVjdF9GQ0IJCT0gMHgwOwogIERPU19MT0wtPm5yX2Jsb2NrX2RldgkJPSAweDA7CiAgRE9TX0xPTC0+bnJfYXZhaWxfZHJpdmVfbGV0dGVycwk9IDI2OyAvKiBBIC0gWiAqLwogIERPU19MT0wtPm5yX2RyaXZlc19KT0lOZWQJCT0gMHgwOwogIERPU19MT0wtPnB0cl9zcGVjX3ByZ19uYW1lcwkJPSAweDA7CiAgRE9TX0xPTC0+cHRyX1NFVFZFUl9wcmdfbGlzdAk9IDB4MDsgLyogbm8gU0VUVkVSIGxpc3QgKi8KICBET1NfTE9MLT5ET1NfSElHSF9BMjBfZnVuY19vZmZzCT0gMHgwOwogIERPU19MT0wtPlBTUF9sYXN0X2V4ZWMJCT0gMHgwOwogIERPU19MT0wtPkJVRkZFUlNfdmFsCQk9IDk5OyAvKiBtYXhpbXVtOiA5OSAqLwogIERPU19MT0wtPkJVRkZFUlNfbnJfbG9va2FoZWFkCT0gODsgLyogbWF4aW11bTogOCAqLwogIERPU19MT0wtPmJvb3RfZHJpdmUJCQk9IDM7IC8qIEM6ICovCiAgRE9TX0xPTC0+ZmxhZ19EV09SRF9tb3ZlcwkJPSAweDAxOyAvKiBpMzg2KyAqLwogIERPU19MT0wtPnNpemVfZXh0ZW5kZWRfbWVtCQk9IDB4ZjAwMDsgLyogdmVyeSBoaWdoIHZhbHVlICovCn0KCnZvaWQgRE9TREVWX0luc3RhbGxET1NEZXZpY2VzKHZvaWQpCnsKICBET1NfREFUQVNFRyAqZGF0YXNlZzsKICBVSU5UMTYgc2VnOwogIHVuc2lnbmVkIGludCBuOwoKICAvKiBhbGxvY2F0ZSBET1MgZGF0YSBzZWdtZW50IG9yIHNvbWV0aGluZyAqLwogIERPU19MT0xTZWcgPSBHbG9iYWxET1NBbGxvYzE2KHNpemVvZihET1NfREFUQVNFRykpOwogIHNlZyA9IEhJV09SRChET1NfTE9MU2VnKTsKICBkYXRhc2VnID0gTWFwU0woIE1BS0VTRUdQVFIoTE9XT1JEKERPU19MT0xTZWcpLCAwKSApOwoKICAvKiBpbml0aWFsaXplIHRoZSBtYWduaWZpY2VudCBMaXN0IE9mIExpc3RzICovCiAgSW5pdExpc3RPZkxpc3RzKCZkYXRhc2VnLT5sb2wpOwoKICAvKiBTZXQgdXAgZmlyc3QgZGV2aWNlIChOVUwpICovCiAgZGF0YXNlZy0+bG9sLk5VTF9kZXYubmV4dF9kZXYgID0gTUFLRVNFR1BUUihzZWcsIERPU19EQVRBU0VHX09GRihkZXZbMF0pKTsKICBkYXRhc2VnLT5sb2wuTlVMX2Rldi5hdHRyICAgICAgPSBkZXZzWzBdLmF0dHI7CiAgZGF0YXNlZy0+bG9sLk5VTF9kZXYuc3RyYXRlZ3kgID0gRE9TX0RBVEFTRUdfT0ZGKHRodW5rWzBdLmxqbXAxKTsKICBkYXRhc2VnLT5sb2wuTlVMX2Rldi5pbnRlcnJ1cHQgPSBET1NfREFUQVNFR19PRkYodGh1bmtbMF0ubGptcDIpOwogIG1lbWNweShkYXRhc2VnLT5sb2wuTlVMX2Rldi5uYW1lLCBkZXZzWzBdLm5hbWUsIDgpOwoKICAvKiBTZXQgdXAgdGhlIHJlbWFpbmluZyBkZXZpY2VzICovCiAgZm9yIChuID0gMTsgbiA8IE5SX0RFVlM7IG4rKykKICB7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5uZXh0X2RldiAgPSAobisxKSA9PSBOUl9ERVZTID8gTk9ORVhUIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VTRUdQVFIoc2VnLCBET1NfREFUQVNFR19PRkYoZGV2W25dKSk7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5hdHRyICAgICAgPSBkZXZzW25dLmF0dHI7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5zdHJhdGVneSAgPSBET1NfREFUQVNFR19PRkYodGh1bmtbbl0ubGptcDEpOwogICAgZGF0YXNlZy0+ZGV2W24tMV0uaW50ZXJydXB0ID0gRE9TX0RBVEFTRUdfT0ZGKHRodW5rW25dLmxqbXAyKTsKICAgIG1lbWNweShkYXRhc2VnLT5kZXZbbi0xXS5uYW1lLCBkZXZzW25dLm5hbWUsIDgpOwogIH0KCiAgLyogU2V0IHVwIHRodW5rcyAqLwogIGZvciAobiA9IDA7IG4gPCBOUl9ERVZTOyBuKyspCiAgewogICAgZGF0YXNlZy0+dGh1bmtbbl0ubGptcDEgICAgID0gTEpNUDsKICAgIGRhdGFzZWctPnRodW5rW25dLnN0cmF0ZWd5ICA9IChSTUNCUFJPQylEUE1JX0FsbG9jSW50ZXJuYWxSTUNCKGRldnNbbl0uc3RyYXRlZ3kpOwogICAgZGF0YXNlZy0+dGh1bmtbbl0ubGptcDIgICAgID0gTEpNUDsKICAgIGRhdGFzZWctPnRodW5rW25dLmludGVycnVwdCA9IChSTUNCUFJPQylEUE1JX0FsbG9jSW50ZXJuYWxSTUNCKGRldnNbbl0uaW50ZXJydXB0KTsKICB9CgogIC8qIENPTiBpcyBkZXZpY2UgMSAqLwogIGRhdGFzZWctPmxvbC5wdHJfQ09OX2Rldl9oZHIgPSBNQUtFU0VHUFRSKHNlZywgRE9TX0RBVEFTRUdfT0ZGKGRldlswXSkpOwp9CgpEV09SRCBET1NERVZfQ29uc29sZSh2b2lkKQp7CiAgcmV0dXJuIERPU01FTV9MT0woKS0+cHRyX0NPTl9kZXZfaGRyOwp9CgpEV09SRCBET1NERVZfRmluZENoYXJEZXZpY2UoY2hhcipuYW1lKQp7CiAgU0VHUFRSIGN1cl9wdHIgPSBNQUtFU0VHUFRSKEhJV09SRChET1NfTE9MU2VnKSwgRklFTERfT0ZGU0VUKERPU19MSVNUT0ZMSVNUUyxOVUxfZGV2KSk7CiAgRE9TX0RFVklDRV9IRUFERVIgKmN1ciA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoY3VyX3B0cik7CiAgY2hhciBkbmFtZVs4XTsKICBpbnQgY250OwoKICAvKiBnZXQgZmlyc3QgOCBjaGFyYWN0ZXJzICovCiAgc3RybmNweShkbmFtZSxuYW1lLDgpOwogIC8qIGlmIGxlc3MgdGhhbiA4IGNoYXJhY3RlcnMsIHBhZCB3aXRoIHNwYWNlcyAqLwogIGZvciAoY250PTA7IGNudDw4OyBjbnQrKykKICAgIGlmICghZG5hbWVbY250XSkgZG5hbWVbY250XT0nICc7CgogIC8qIHNlYXJjaCBmb3IgY2hhciBkZXZpY2VzIHdpdGggdGhlIHJpZ2h0IG5hbWUgKi8KICB3aGlsZSAoY3VyICYmCgkgKCghKGN1ci0+YXR0ciAmIEFUVFJfQ0hBUikpIHx8CgkgIG1lbWNtcChjdXItPm5hbWUsZG5hbWUsOCkpKSB7CiAgICBjdXJfcHRyID0gY3VyLT5uZXh0X2RldjsKICAgIGlmIChjdXJfcHRyID09IE5PTkVYVCkgY3VyPU5VTEw7CiAgICBlbHNlIGN1ciA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoY3VyX3B0cik7CiAgfQogIHJldHVybiBjdXJfcHRyOwp9CgpzdGF0aWMgdm9pZCBET1NERVZfRG9SZXEodm9pZCpyZXEsIERXT1JEIGRldikKewogIFJFUVVFU1RfSEVBREVSICpoZHIgPSAoUkVRVUVTVF9IRUFERVIgKilyZXE7CiAgRE9TX0RFVklDRV9IRUFERVIgKmRoZHI7CiAgQ09OVEVYVDg2IGN0eDsKICBjaGFyICpwaGRyOwoKICBkaGRyID0gRE9TTUVNX01hcFJlYWxUb0xpbmVhcihkZXYpOwogIHBoZHIgPSAoKGNoYXIqKURPU01FTV9MT0woKSkgKyBET1NfREFUQVNFR19PRkYocmVxKTsKCiAgLyogY29weSByZXF1ZXN0IHRvIHJlcXVlc3Qgc2NyYXRjaCBhcmVhICovCiAgbWVtY3B5KHBoZHIsIHJlcSwgaGRyLT5zaXplKTsKCiAgLyogcHJlcGFyZSB0byBjYWxsIGRldmljZSBkcml2ZXIgKi8KICBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOwoKICAvKiBFUzpCWCBwb2ludHMgdG8gcmVxdWVzdCBmb3Igc3RyYXRlZ3kgcm91dGluZSAqLwogIGN0eC5TZWdFcyA9IEhJV09SRChET1NfTE9MU2VnKTsKICBjdHguRWJ4ICAgPSBET1NfREFUQVNFR19PRkYocmVxKTsKCiAgLyogY2FsbCBzdHJhdGVneSByb3V0aW5lICovCiAgY3R4LlNlZ0NzID0gU0VMRUNUT1JPRihkZXYpOwogIGN0eC5FaXAgICA9IGRoZHItPnN0cmF0ZWd5OwogIERQTUlfQ2FsbFJNUHJvYygmY3R4LCAwLCAwLCAwKTsKCiAgLyogY2FsbCBpbnRlcnJ1cHQgcm91dGluZSAqLwogIGN0eC5TZWdDcyA9IFNFTEVDVE9ST0YoZGV2KTsKICBjdHguRWlwICAgPSBkaGRyLT5pbnRlcnJ1cHQ7CiAgRFBNSV9DYWxsUk1Qcm9jKCZjdHgsIDAsIDAsIDApOwoKICAvKiBjb21wbGV0ZWQsIGNvcHkgcmVxdWVzdCBiYWNrICovCiAgbWVtY3B5KHJlcSwgcGhkciwgaGRyLT5zaXplKTsKCiAgaWYgKGhkci0+c3RhdHVzICYgU1RBVF9FUlJPUikgewogICAgc3dpdGNoIChoZHItPnN0YXR1cyAmIFNUQVRfTUFTSykgewogICAgY2FzZSAweDBGOiAvKiBpbnZhbGlkIGRpc2sgY2hhbmdlICovCiAgICAgIC8qIHRoaXMgZXJyb3Igc2VlbXMgdG8gZml0IHRoZSBiaWxsICovCiAgICAgIFNldExhc3RFcnJvcihFUl9Ob3RTYW1lRGV2aWNlKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBTZXRMYXN0RXJyb3IoKGhkci0+c3RhdHVzICYgU1RBVF9NQVNLKSArIDB4MTMpOwogICAgICBicmVhazsKICAgIH0KICB9Cn0KCnN0YXRpYyBpbnQgRE9TREVWX0lPKHVuc2lnbmVkIGNtZCwgRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICBSRVFfSU8gcmVxOwoKICByZXEuaGRyLnNpemU9c2l6ZW9mKHJlcSk7CiAgcmVxLmhkci51bml0PTA7IC8qIG5vdCBkZWFsaW5nIHdpdGggYmxvY2sgZGV2aWNlcyB5ZXQgKi8KICByZXEuaGRyLmNvbW1hbmQ9Y21kOwogIHJlcS5oZHIuc3RhdHVzPVNUQVRfQlVTWTsKICByZXEubWVkaWE9MDsgLyogbm90IGRlYWxpbmcgd2l0aCBibG9jayBkZXZpY2VzIHlldCAqLwogIHJlcS5idWZmZXI9YnVmOwogIHJlcS5jb3VudD1idWZsZW47CiAgcmVxLnNlY3Rvcj0wOyAvKiBibG9jayBkZXZpY2VzICovCiAgcmVxLnZvbHVtZT0wOyAvKiBibG9jayBkZXZpY2VzICovCgogIERPU0RFVl9Eb1JlcSgmcmVxLCBkZXYpOwoKICByZXR1cm4gcmVxLmNvdW50Owp9CgppbnQgRE9TREVWX1BlZWsoRFdPUkQgZGV2LCBCWVRFKmRhdGEpCnsKICBSRVFfU0FGRUlOUFVUIHJlcTsKCiAgcmVxLmhkci5zaXplPXNpemVvZihyZXEpOwogIHJlcS5oZHIudW5pdD0wOyAvKiBub3QgZGVhbGluZyB3aXRoIGJsb2NrIGRldmljZXMgeWV0ICovCiAgcmVxLmhkci5jb21tYW5kPUNNRF9TQUZFSU5QVVQ7CiAgcmVxLmhkci5zdGF0dXM9U1RBVF9CVVNZOwogIHJlcS5kYXRhPTA7CgogIERPU0RFVl9Eb1JlcSgmcmVxLCBkZXYpOwoKICBpZiAocmVxLmhkci5zdGF0dXMgJiBTVEFUX0JVU1kpIHJldHVybiAwOwoKICAqZGF0YSA9IHJlcS5kYXRhOwogIHJldHVybiAxOwp9CgppbnQgRE9TREVWX1JlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICByZXR1cm4gRE9TREVWX0lPKENNRF9JTlBVVCwgZGV2LCBidWYsIGJ1Zmxlbik7Cn0KCmludCBET1NERVZfV3JpdGUoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4sIGludCB2ZXJpZnkpCnsKICByZXR1cm4gRE9TREVWX0lPKHZlcmlmeT9DTURfU0FGRU9VVFBVVDpDTURfT1VUUFVULCBkZXYsIGJ1ZiwgYnVmbGVuKTsKfQoKaW50IERPU0RFVl9Jb2N0bFJlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICByZXR1cm4gRE9TREVWX0lPKENNRF9JTklPQ1RMLCBkZXYsIGJ1ZiwgYnVmbGVuKTsKfQoKaW50IERPU0RFVl9Jb2N0bFdyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKQp7CiAgcmV0dXJuIERPU0RFVl9JTyhDTURfT1VUSU9DVEwsIGRldiwgYnVmLCBidWZsZW4pOwp9Cg==