LyoKICogRE9TIGRldmljZXMKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAibXNkb3MuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgImRvc2V4ZS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKI2luY2x1ZGUgInBzaHBhY2sxLmgiCgp0eXBlZGVmIHN0cnVjdCB7CiAgQllURSBsam1wMTsKICBSTUNCUFJPQyBzdHJhdGVneTsKICBCWVRFIGxqbXAyOwogIFJNQ0JQUk9DIGludGVycnVwdDsKfSBXSU5FREVWX1RIVU5LOwoKdHlwZWRlZiBzdHJ1Y3QgewogIEJZVEUgc2l6ZTsgLyogbGVuZ3RoIG9mIGhlYWRlciArIGRhdGEgKi8KICBCWVRFIHVuaXQ7IC8qIHVuaXQgKGJsb2NrIGRldmljZXMgb25seSkgKi8KICBCWVRFIGNvbW1hbmQ7CiAgV09SRCBzdGF0dXM7CiAgQllURSByZXNlcnZlZFs4XTsKfSBSRVFVRVNUX0hFQURFUjsKCnR5cGVkZWYgc3RydWN0IHsKICBSRVFVRVNUX0hFQURFUiBoZHI7CiAgQllURSBtZWRpYTsgLyogbWVkaWEgZGVzY3JpcHRvciBmcm9tIEJQQiAqLwogIFNFR1BUUiBidWZmZXI7CiAgV09SRCBjb3VudDsgLyogYnl0ZS9zZWN0b3IgY291bnQgKi8KICBXT1JEIHNlY3RvcjsgLyogc3RhcnRpbmcgc2VjdG9yIChibG9jayBkZXZpY2VzKSAqLwogIERXT1JEIHZvbHVtZTsgLyogdm9sdW1lIElEIChibG9jayBkZXZpY2VzKSAqLwp9IFJFUV9JTzsKCnR5cGVkZWYgc3RydWN0IHsKICBSRVFVRVNUX0hFQURFUiBoZHI7CiAgQllURSBkYXRhOwp9IFJFUV9TQUZFSU5QVVQ7CgojaW5jbHVkZSAicG9wcGFjay5oIgoKI2RlZmluZSBDT05fQlVGRkVSIDEyOAoKZW51bSBzdHJhdGVneSB7IFNZU1RFTV9TVFJBVEVHWV9OVUwsIFNZU1RFTV9TVFJBVEVHWV9DT04sIE5CX1NZU1RFTV9TVFJBVEVHSUVTIH07CgpzdGF0aWMgdm9pZCAqc3RyYXRlZ3lfZGF0YVtOQl9TWVNURU1fU1RSQVRFR0lFU107CgojZGVmaW5lIE5PTkVYVCAoKERXT1JEKS0xKQoKI2RlZmluZSBBVFRSX1NURElOICAgICAweDAwMDEKI2RlZmluZSBBVFRSX1NURE9VVCAgICAweDAwMDIKI2RlZmluZSBBVFRSX05VTCAgICAgICAweDAwMDQKI2RlZmluZSBBVFRSX0NMT0NLICAgICAweDAwMDgKI2RlZmluZSBBVFRSX0ZBU1RDT04gICAweDAwMTAKI2RlZmluZSBBVFRSX1JBVyAgICAgICAweDAwMjAKI2RlZmluZSBBVFRSX05PVEVPRiAgICAweDAwNDAKI2RlZmluZSBBVFRSX0RFVklDRSAgICAweDAwODAKI2RlZmluZSBBVFRSX1JFTU9WQUJMRSAweDA4MDAKI2RlZmluZSBBVFRSX05PTklCTSAgICAweDIwMDAgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIEFUVFJfVU5USUxCVVNZIDB4MjAwMCAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBBVFRSX0lPQ1RMICAgICAweDQwMDAKI2RlZmluZSBBVFRSX0NIQVIgICAgICAweDgwMDAKCiNkZWZpbmUgQ01EX0lOSVQgICAgICAgMAojZGVmaW5lIENNRF9NRURJQUNIRUNLIDEgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9CVUlMREJQQiAgIDIgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9JTklPQ1RMICAgIDMKI2RlZmluZSBDTURfSU5QVVQgICAgICA0IC8qIHJlYWQgZGF0YSAqLwojZGVmaW5lIENNRF9TQUZFSU5QVVQgIDUgLyogIm5vbi1kZXN0cnVjdGl2ZSBpbnB1dCBubyB3YWl0IiwgY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX0lOU1RBVFVTICAgNiAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfSU5GTFVTSCAgICA3IC8qIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9PVVRQVVQgICAgIDggLyogd3JpdGUgZGF0YSAqLwojZGVmaW5lIENNRF9TQUZFT1VUUFVUIDkgLyogd3JpdGUgZGF0YSB3aXRoIHZlcmlmeSAqLwojZGVmaW5lIENNRF9PVVRTVEFUVVMgMTAgLyogY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX09VVEZMVVNIICAxMSAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfT1VUSU9DVEwgIDEyCiNkZWZpbmUgQ01EX0RFVk9QRU4gICAxMwojZGVmaW5lIENNRF9ERVZDTE9TRSAgMTQKI2RlZmluZSBDTURfUkVNT1ZBQkxFIDE1IC8qIGJsb2NrIGRldmljZXMgKi8KI2RlZmluZSBDTURfVU5USUxCVVNZIDE2IC8qIG91dHB1dCB1bnRpbCBidXN5ICovCgojZGVmaW5lIFNUQVRfTUFTSyAgMHgwMEZGCiNkZWZpbmUgU1RBVF9ET05FICAweDAxMDAKI2RlZmluZSBTVEFUX0JVU1kgIDB4MDIwMAojZGVmaW5lIFNUQVRfRVJST1IgMHg4MDAwCgojZGVmaW5lIExKTVAgMHhlYQoKCi8qIHByb3RvdHlwZXMgKi8Kc3RhdGljIHZvaWQgV0lOQVBJIG51bF9zdHJhdGVneShDT05URVhUODYqY3R4KTsKc3RhdGljIHZvaWQgV0lOQVBJIG51bF9pbnRlcnJ1cHQoQ09OVEVYVDg2KmN0eCk7CnN0YXRpYyB2b2lkIFdJTkFQSSBjb25fc3RyYXRlZ3koQ09OVEVYVDg2KmN0eCk7CnN0YXRpYyB2b2lkIFdJTkFQSSBjb25faW50ZXJydXB0KENPTlRFWFQ4NipjdHgpOwoKLyogZGV2aWNlcyAqLwp0eXBlZGVmIHN0cnVjdCAKewogICAgY2hhciBuYW1lWzhdOwogICAgV09SRCBhdHRyOwogICAgUk1DQlBST0Mgc3RyYXRlZ3k7CiAgICBSTUNCUFJPQyBpbnRlcnJ1cHQ7CiAgICAKfSBXSU5FREVWOwoKc3RhdGljIFdJTkVERVYgZGV2c1tdID0gCnsKICB7ICJOVUwgICAgICIsCiAgICBBVFRSX0NIQVJ8QVRUUl9OVUx8QVRUUl9ERVZJQ0UsCiAgICBudWxfc3RyYXRlZ3ksIG51bF9pbnRlcnJ1cHQgfSwKCiAgeyAiQ09OICAgICAiLAogICAgQVRUUl9DSEFSfEFUVFJfU1RESU58QVRUUl9TVERPVVR8QVRUUl9GQVNUQ09OfEFUVFJfTk9URU9GfEFUVFJfREVWSUNFLAogICAgY29uX3N0cmF0ZWd5LCBjb25faW50ZXJydXB0IH0KfTsKCiNkZWZpbmUgTlJfREVWUyAoc2l6ZW9mKGRldnMpL3NpemVvZihXSU5FREVWKSkKCi8qIERPUyBkYXRhIHNlZ21lbnQgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgRE9TX0xJU1RPRkxJU1RTICAgIGxvbDsKICAgIERPU19ERVZJQ0VfSEVBREVSICBkZXZbTlJfREVWUy0xXTsKICAgIFdJTkVERVZfVEhVTksgICAgICB0aHVua1tOUl9ERVZTXTsKICAgIFJFUV9JTyAgICAgICAgICAgICByZXE7CiAgICBCWVRFICAgICAgICAgICAgICAgYnVmZmVyW0NPTl9CVUZGRVJdOwoKfSBET1NfREFUQVNFRzsKCiNkZWZpbmUgRE9TX0RBVEFTRUdfT0ZGKHh4eCkgRklFTERfT0ZGU0VUKERPU19EQVRBU0VHLCB4eHgpCgpEV09SRCBET1NfTE9MU2VnOwoKCi8qIHRoZSBkZXZpY2UgaW1wbGVtZW50YXRpb25zICovCnN0YXRpYyB2b2lkIGRvX2xyZXQoQ09OVEVYVDg2KmN0eCkKewogIFdPUkQgKnN0YWNrID0gQ1RYX1NFR19PRkZfVE9fTElOKGN0eCwgY3R4LT5TZWdTcywgY3R4LT5Fc3ApOwoKICBjdHgtPkVpcCAgID0gKihzdGFjaysrKTsKICBjdHgtPlNlZ0NzID0gKihzdGFjaysrKTsKICBjdHgtPkVzcCAgKz0gMipzaXplb2YoV09SRCk7Cn0KCnN0YXRpYyB2b2lkIGRvX3N0cmF0ZWd5KENPTlRFWFQ4NipjdHgsIGludCBpZCwgaW50IGV4dHJhKQp7CiAgUkVRVUVTVF9IRUFERVIgKmhkciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjdHgsIGN0eC0+U2VnRXMsIGN0eC0+RWJ4KTsKICB2b2lkICoqaGRyX3B0ciA9IHN0cmF0ZWd5X2RhdGFbaWRdOwoKICBpZiAoIWhkcl9wdHIpIHsKICAgIGhkcl9wdHIgPSBjYWxsb2MoMSxzaXplb2Yodm9pZCAqKStleHRyYSk7CiAgICBzdHJhdGVneV9kYXRhW2lkXSA9IGhkcl9wdHI7CiAgfQogICpoZHJfcHRyID0gaGRyOwogIGRvX2xyZXQoY3R4KTsKfQoKc3RhdGljIFJFUVVFU1RfSEVBREVSICogZ2V0X2hkcihpbnQgaWQsIHZvaWQqKmV4dHJhKQp7CiAgdm9pZCAqKmhkcl9wdHIgPSBzdHJhdGVneV9kYXRhW2lkXTsKICBpZiAoZXh0cmEpCiAgICAqZXh0cmEgPSBoZHJfcHRyID8gKHZvaWQqKShoZHJfcHRyKzEpIDogKHZvaWQgKilOVUxMOwogIHJldHVybiBoZHJfcHRyID8gKmhkcl9wdHIgOiAodm9pZCAqKU5VTEw7Cn0KCnN0YXRpYyB2b2lkIFdJTkFQSSBudWxfc3RyYXRlZ3koQ09OVEVYVDg2KmN0eCkKewogIGRvX3N0cmF0ZWd5KGN0eCwgU1lTVEVNX1NUUkFURUdZX05VTCwgMCk7Cn0KCnN0YXRpYyB2b2lkIFdJTkFQSSBudWxfaW50ZXJydXB0KENPTlRFWFQ4NipjdHgpCnsKICBSRVFVRVNUX0hFQURFUiAqaGRyID0gZ2V0X2hkcihTWVNURU1fU1RSQVRFR1lfTlVMLCBOVUxMKTsKICAvKiBlYXQgZXZlcnl0aGluZyBhbmQgcmVjeWNsZSBub3RoaW5nICovCiAgc3dpdGNoIChoZHItPmNvbW1hbmQpIHsKICBjYXNlIENNRF9JTlBVVDoKICAgICgoUkVRX0lPKiloZHIpLT5jb3VudCA9IDA7CiAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICAgIGJyZWFrOwogIGNhc2UgQ01EX1NBRkVJTlBVVDoKICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FfFNUQVRfQlVTWTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICB9CiAgZG9fbHJldChjdHgpOwp9CgpzdGF0aWMgdm9pZCBXSU5BUEkgY29uX3N0cmF0ZWd5KENPTlRFWFQ4NipjdHgpCnsKICBkb19zdHJhdGVneShjdHgsIFNZU1RFTV9TVFJBVEVHWV9DT04sIHNpemVvZihpbnQpKTsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIGNvbl9pbnRlcnJ1cHQoQ09OVEVYVDg2KmN0eCkKewogIGludCAqc2NhbjsKICBSRVFVRVNUX0hFQURFUiAqaGRyID0gZ2V0X2hkcihTWVNURU1fU1RSQVRFR1lfQ09OLCh2b2lkICoqKSZzY2FuKTsKICBCSU9TREFUQSAqYmlvcyA9IERPU01FTV9CaW9zRGF0YSgpOwogIFdPUkQgQ3VyT2ZzID0gYmlvcy0+TmV4dEtiZENoYXJQdHI7CiAgRE9TX0xJU1RPRkxJU1RTICpsb2wgPSBET1NNRU1fTE9MKCk7CiAgRE9TX0RBVEFTRUcgKmRhdGFzZWcgPSAoRE9TX0RBVEFTRUcgKilsb2w7CiAgQllURSAqbGluZWJ1ZmZlciA9IGRhdGFzZWctPmJ1ZmZlcjsKICBCWVRFICpjdXJidWZmZXIgPSAobG9sLT5vZmZzX3VucmVhZF9DT04pID8KICAgICgoKEJZVEUqKWRhdGFzZWcpICsgbG9sLT5vZmZzX3VucmVhZF9DT04pIDogKEJZVEUqKU5VTEw7CiAgRE9TX0RFVklDRV9IRUFERVIgKmNvbiA9IGRhdGFzZWctPmRldjsKCiAgc3dpdGNoIChoZHItPmNvbW1hbmQpIHsKICBjYXNlIENNRF9JTlBVVDoKICAgIHsKICAgICAgUkVRX0lPICppbyA9IChSRVFfSU8gKiloZHI7CiAgICAgIFdPUkQgY291bnQgPSBpby0+Y291bnQsIGxlbiA9IDA7CiAgICAgIEJZVEUgKmJ1ZmZlciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjdHgsCgkJCQkJU0VMRUNUT1JPRihpby0+YnVmZmVyKSwKCQkJCQkoRFdPUkQpT0ZGU0VUT0YoaW8tPmJ1ZmZlcikpOwoKICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0JVU1k7CiAgICAgIC8qIGZpcnN0LCBjaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgaGF2ZSBkYXRhIGluIGxpbmUgYnVmZmVyICovCiAgICAgIGlmIChjdXJidWZmZXIpIHsKCS8qIHllcCwgY29weSBhcyBtdWNoIGFzIHdlIGNhbiAqLwoJQllURSBkYXRhID0gMDsKCXdoaWxlICgobGVuPGNvdW50KSAmJiAoZGF0YSAhPSAnXHInKSkgewoJICBkYXRhID0gKmN1cmJ1ZmZlcisrOwoJICBidWZmZXJbbGVuKytdID0gZGF0YTsKCX0KCWlmIChkYXRhID09ICdccicpIHsKCSAgLyogbGluZSBidWZmZXIgZW1wdGllZCAqLwoJICBsb2wtPm9mZnNfdW5yZWFkX0NPTiA9IDA7CgkgIGN1cmJ1ZmZlciA9IE5VTEw7CgkgIC8qIGlmIHdlJ3JlIG5vdCBpbiByYXcgbW9kZSwgY2FsbCBpdCBhIGRheSovCgkgIGlmICghKGNvbi0+YXR0ciAmIEFUVFJfUkFXKSkgewoJICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwoJICAgIGlvLT5jb3VudCA9IGxlbjsKCSAgICBicmVhazsKCSAgfQoJfSBlbHNlIHsKCSAgLyogc3RpbGwgc29tZSBkYXRhIGxlZnQgKi8KCSAgbG9sLT5vZmZzX3VucmVhZF9DT04gPSBjdXJidWZmZXIgLSAoQllURSopbG9sOwoJICAvKiBidXQgYnVmZmVyIHdhcyBmaWxsZWQsIHdlJ3JlIGRvbmUgKi8KCSAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CgkgIGlvLT5jb3VudCA9IGxlbjsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KCiAgICAgIC8qIGlmIHdlJ3JlIGluIHJhdyBtb2RlLCB3ZSBqdXN0IG5lZWQgdG8gZmlsbCB0aGUgYnVmZmVyICovCiAgICAgIGlmIChjb24tPmF0dHIgJiBBVFRSX1JBVykgewoJd2hpbGUgKGxlbjxjb3VudCkgewoJICBXT1JEIGRhdGE7CgoJICAvKiBkbyB3ZSBoYXZlIGEgd2FpdGluZyBzY2FuY29kZT8gKi8KCSAgaWYgKCpzY2FuKSB7CgkgICAgLyogeWVzLCBzdG9yZSBzY2FuY29kZSBpbiBidWZmZXIgKi8KCSAgICBidWZmZXJbbGVuKytdID0gKnNjYW47CgkgICAgKnNjYW4gPSAwOwoJICAgIGlmIChsZW49PWNvdW50KSBicmVhazsKCSAgfQoKCSAgLyogY2hlY2sgZm9yIG5ldyBrZXlib2FyZCBpbnB1dCAqLwoJICB3aGlsZSAoQ3VyT2ZzID09IGJpb3MtPkZpcnN0S2JkQ2hhclB0cikgewoJICAgIC8qIG5vIGlucHV0IGF2YWlsYWJsZSB5ZXQsIHNvIHdhaXQuLi4gKi8KCSAgICBET1NWTV9XYWl0KCAtMSwgMCApOwoJICB9CgkgIC8qIHJlYWQgZnJvbSBrZXlib2FyZCBxdWV1ZSAoY2FsbCBpbnQxNj8pICovCgkgIGRhdGEgPSAoKFdPUkQqKWJpb3MpW0N1ck9mc107CgkgIEN1ck9mcyArPSAyOwoJICBpZiAoQ3VyT2ZzID49IGJpb3MtPktiZEJ1ZmZlckVuZCkgQ3VyT2ZzID0gYmlvcy0+S2JkQnVmZmVyU3RhcnQ7CgkgIGJpb3MtPk5leHRLYmRDaGFyUHRyID0gQ3VyT2ZzOwoJICAvKiBpZiBpdCdzIGFuIGV4dGVuZGVkIGtleSwgc2F2ZSBzY2FuY29kZSAqLwoJICBpZiAoTE9CWVRFKGRhdGEpID09IDApICpzY2FuID0gSElCWVRFKGRhdGEpOwoJICAvKiBzdG9yZSBBU0NJSSBjaGFyIGluIGJ1ZmZlciAqLwoJICBidWZmZXJbbGVuKytdID0gTE9CWVRFKGRhdGEpOwoJfQogICAgICB9IGVsc2UgewoJLyogd2UncmUgbm90IGluIHJhdyBtb2RlLCBzbyB3ZSBuZWVkIHRvIGRvIGxpbmUgaW5wdXQuLi4gKi8KCXdoaWxlIChUUlVFKSB7CgkgIFdPUkQgZGF0YTsKCSAgLyogY2hlY2sgZm9yIG5ldyBrZXlib2FyZCBpbnB1dCAqLwoJICB3aGlsZSAoQ3VyT2ZzID09IGJpb3MtPkZpcnN0S2JkQ2hhclB0cikgewoJICAgIC8qIG5vIGlucHV0IGF2YWlsYWJsZSB5ZXQsIHNvIHdhaXQuLi4gKi8KCSAgICBET1NWTV9XYWl0KCAtMSwgMCApOwoJICB9CgkgIC8qIHJlYWQgZnJvbSBrZXlib2FyZCBxdWV1ZSAoY2FsbCBpbnQxNj8pICovCgkgIGRhdGEgPSAoKFdPUkQqKWJpb3MpW0N1ck9mc107CgkgIEN1ck9mcyArPSAyOwoJICBpZiAoQ3VyT2ZzID49IGJpb3MtPktiZEJ1ZmZlckVuZCkgQ3VyT2ZzID0gYmlvcy0+S2JkQnVmZmVyU3RhcnQ7CgkgIGJpb3MtPk5leHRLYmRDaGFyUHRyID0gQ3VyT2ZzOwoKCSAgaWYgKExPQllURShkYXRhKSA9PSAnXHInKSB7CgkgICAgLyogaXQncyB0aGUgcmV0dXJuIGtleSwgd2UncmUgZG9uZSAqLwoJICAgIGxpbmVidWZmZXJbbGVuKytdID0gTE9CWVRFKGRhdGEpOwoJICAgIGJyZWFrOwoJICB9CgkgIGVsc2UgaWYgKExPQllURShkYXRhKSA+PSAnICcpIHsKCSAgICAvKiBhIGNoYXJhY3RlciAqLwoJICAgIGlmICgobGVuKzEpPENPTl9CVUZGRVIpIHsKCSAgICAgIGxpbmVidWZmZXJbbGVuXSA9IExPQllURShkYXRhKTsKCSAgICAgIFdyaXRlRmlsZShHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLCAmbGluZWJ1ZmZlcltsZW4rK10sIDEsIE5VTEwsIE5VTEwpOwoJICAgIH0KCSAgICAvKiBlbHNlIGJlZXAsIGJ1dCBJIGRvbid0IGxpa2Ugbm9pc2UgKi8KCSAgfQoJICBlbHNlIHN3aXRjaCAoTE9CWVRFKGRhdGEpKSB7CgkgIGNhc2UgJ1xiJzoKCSAgICBpZiAobGVuPjApIHsKCSAgICAgIGxlbi0tOwoJICAgICAgV3JpdGVGaWxlKEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSksICJcYiBcYiIsIDMsIE5VTEwsIE5VTEwpOwoJICAgIH0KCSAgICBicmVhazsKCSAgfQoJfQoJaWYgKGxlbiA+IGNvdW50KSB7CgkgIC8qIHNhdmUgcmVzdCBvZiBsaW5lIGZvciBsYXRlciAqLwoJICBsb2wtPm9mZnNfdW5yZWFkX0NPTiA9IGxpbmVidWZmZXIgLSAoQllURSopbG9sICsgY291bnQ7CgkgIGxlbiA9IGNvdW50OwoJfQoJbWVtY3B5KGJ1ZmZlciwgbGluZWJ1ZmZlciwgbGVuKTsKICAgICAgfQogICAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICAgICAgaW8tPmNvdW50ID0gbGVuOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSBDTURfU0FGRUlOUFVUOgogICAgaWYgKGN1cmJ1ZmZlcikgewogICAgICAvKiBzb21lIGxpbmUgaW5wdXQgd2FpdGluZyAqLwogICAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICAgICAgKChSRVFfU0FGRUlOUFVUKiloZHIpLT5kYXRhID0gKmN1cmJ1ZmZlcjsKICAgIH0KICAgIGVsc2UgaWYgKGNvbi0+YXR0ciAmIEFUVFJfUkFXKSB7CiAgICAgIGlmIChDdXJPZnMgPT0gYmlvcy0+Rmlyc3RLYmRDaGFyUHRyKSB7CgkvKiBubyBpbnB1dCAqLwoJaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkV8U1RBVF9CVVNZOwogICAgICB9IGVsc2UgewoJLyogc29tZSBrZXlib2FyZCBpbnB1dCB3YWl0aW5nICovCgloZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKCSgoUkVRX1NBRkVJTlBVVCopaGRyKS0+ZGF0YSA9ICgoQllURSopYmlvcylbQ3VyT2ZzXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLyogbm8gbGluZSBpbnB1dCAqLwogICAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORXxTVEFUX0JVU1k7CiAgICB9CiAgICBicmVhazsKICBjYXNlIENNRF9JTlNUQVRVUzoKICAgIGlmIChjdXJidWZmZXIpIHsKICAgICAgLyogd2UgaGF2ZSBkYXRhICovCiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwogICAgfQogICAgZWxzZSBpZiAoY29uLT5hdHRyICYgQVRUUl9SQVcpIHsKICAgICAgaWYgKEN1ck9mcyA9PSBiaW9zLT5GaXJzdEtiZENoYXJQdHIpIHsKCS8qIG5vIGlucHV0ICovCgloZHItPnN0YXR1cyA9IFNUQVRfRE9ORXxTVEFUX0JVU1k7CiAgICAgIH0gZWxzZSB7CgkvKiBzb21lIGtleWJvYXJkIGlucHV0IHdhaXRpbmcgKi8KCWhkci0+c3RhdHVzID0gU1RBVF9ET05FOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvKiBubyBsaW5lIGlucHV0ICovCiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FfFNUQVRfQlVTWTsKICAgIH0KCiAgICBicmVhazsKICBjYXNlIENNRF9JTkZMVVNIOgogICAgLyogZmx1c2ggbGluZSBhbmQga2V5Ym9hcmQgcXVldWUgKi8KICAgIGxvbC0+b2Zmc191bnJlYWRfQ09OID0gMDsKICAgIGJpb3MtPk5leHRLYmRDaGFyUHRyID0gYmlvcy0+Rmlyc3RLYmRDaGFyUHRyOwogICAgYnJlYWs7CiAgY2FzZSBDTURfT1VUUFVUOgogIGNhc2UgQ01EX1NBRkVPVVRQVVQ6CiAgICB7CiAgICAgIFJFUV9JTyAqaW8gPSAoUkVRX0lPICopaGRyOwogICAgICBCWVRFICpidWZmZXIgPSBDVFhfU0VHX09GRl9UT19MSU4oY3R4LAoJCQkJCVNFTEVDVE9ST0YoaW8tPmJ1ZmZlciksCgkJCQkJKERXT1JEKU9GRlNFVE9GKGlvLT5idWZmZXIpKTsKICAgICAgRFdPUkQgcmVzdWx0ID0gMDsKICAgICAgV3JpdGVGaWxlKEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSksIGJ1ZmZlciwgaW8tPmNvdW50LCAmcmVzdWx0LCBOVUxMKTsKICAgICAgaW8tPmNvdW50ID0gcmVzdWx0OwogICAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICAgIH0KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKICB9CiAgZG9fbHJldChjdHgpOwp9CgpzdGF0aWMgdm9pZCBJbml0TGlzdE9mTGlzdHMoRE9TX0xJU1RPRkxJU1RTICpET1NfTE9MKQp7Ci8qCk91dHB1dCBvZiBET1MgNi4yMjoKCjAxMzM6MDAyMCAgICAgICAgICAgICAgICAgICAgNkEgMTMtMzMgMDEgQ0MgMDAgMzMgMDEgNTkgMDAgICAgICAgICBqLjMuLi4zLlkuCjAxMzM6MDAzMCAgNzAgMDAgMDAgMDAgNzIgMDIgMDAgMDItNkQgMDAgMzMgMDEgMDAgMDAgMkUgMDUgICBwLi4uci4uLm0uMy4uLi4uCjAxMzM6MDA0MCAgMDAgMDAgRkMgMDQgMDAgMDAgMDMgMDgtOTIgMjEgMTEgRTAgMDQgODAgQzYgMEQgICAuLi4uLi4uLi4hLi4uLi4uCjAxMzM6MDA1MCAgQ0MgMEQgNEUgNTUgNEMgMjAgMjAgMjAtMjAgMjAgMDAgMDAgMDAgMDAgMDAgMDAgICAuLk5VTCAgICAgLi4uLi4uCjAxMzM6MDA2MCAgMDAgNEIgQkEgQzEgMDYgMTQgMDAgMDAtMDAgMDMgMDEgMDAgMDQgNzAgQ0UgRkYgICAuSy4uLi4uLi4uLi4ucC4uCjAxMzM6MDA3MCAgRkYgMDAgMDAgMDAgMDAgMDAgMDAgMDAtMDAgMDEgMDAgMDAgMEQgMDUgMDAgMDAgICAuLi4uLi4uLi4uLi4uLi4uCjAxMzM6MDA4MCAgMDAgRkYgRkYgMDAgMDAgMDAgMDAgRkUtMDAgMDAgRjggMDMgRkYgOUYgNzAgMDIgICAuLi4uLi4uLi4uLi4uLnAuCjAxMzM6MDA5MCAgRDAgNDQgQzggRkQgRDQgNDQgQzggRkQtRDQgNDQgQzggRkQgRDAgNDQgQzggRkQgICAuRC4uLkQuLi5ELi4uRC4uCjAxMzM6MDBBMCAgRDAgNDQgQzggRkQgRDAgNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRC4uLkQKKi8KICBET1NfTE9MLT5DWF9JbnQyMV81ZTAxCQk9IDB4MDsKICBET1NfTE9MLT5MUlVfY291bnRfRkNCX2NhY2hlCT0gMHgwOwogIERPU19MT0wtPkxSVV9jb3VudF9GQ0Jfb3BlbgkJPSAweDA7CiAgRE9TX0xPTC0+T0VNX2Z1bmNfaGFuZGxlcgkJPSAtMTsgLyogbm90IGF2YWlsYWJsZSAqLwogIERPU19MT0wtPklOVDIxX29mZnNldAkJPSAweDA7CiAgRE9TX0xPTC0+c2hhcmluZ19yZXRyeV9jb3VudAk9IDM7CiAgRE9TX0xPTC0+c2hhcmluZ19yZXRyeV9kZWxheQk9IDE7CiAgRE9TX0xPTC0+cHRyX2Rpc2tfYnVmCQk9IDB4MDsKICBET1NfTE9MLT5vZmZzX3VucmVhZF9DT04JCT0gMHgwOwogIERPU19MT0wtPnNlZ19maXJzdF9NQ0IJCT0gMHgwOwogIERPU19MT0wtPnB0cl9maXJzdF9EUEIJCT0gMHgwOwogIERPU19MT0wtPnB0cl9maXJzdF9TeXNGaWxlVGFibGUJPSAweDA7CiAgRE9TX0xPTC0+cHRyX2Nsb2NrX2Rldl9oZHIJCT0gMHgwOwogIERPU19MT0wtPnB0cl9DT05fZGV2X2hkcgkJPSAweDA7CiAgRE9TX0xPTC0+bWF4X2J5dGVfcGVyX3NlYwkJPSA1MTI7CiAgRE9TX0xPTC0+cHRyX2Rpc2tfYnVmX2luZm8JCT0gMHgwOwogIERPU19MT0wtPnB0cl9hcnJheV9DRFMJCT0gMHgwOwogIERPU19MT0wtPnB0cl9zeXNfRkNCCQk9IDB4MDsKICBET1NfTE9MLT5ucl9wcm90ZWN0X0ZDQgkJPSAweDA7CiAgRE9TX0xPTC0+bnJfYmxvY2tfZGV2CQk9IDB4MDsKICBET1NfTE9MLT5ucl9hdmFpbF9kcml2ZV9sZXR0ZXJzCT0gMjY7IC8qIEEgLSBaICovCiAgRE9TX0xPTC0+bnJfZHJpdmVzX0pPSU5lZAkJPSAweDA7CiAgRE9TX0xPTC0+cHRyX3NwZWNfcHJnX25hbWVzCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfU0VUVkVSX3ByZ19saXN0CT0gMHgwOyAvKiBubyBTRVRWRVIgbGlzdCAqLwogIERPU19MT0wtPkRPU19ISUdIX0EyMF9mdW5jX29mZnMJPSAweDA7CiAgRE9TX0xPTC0+UFNQX2xhc3RfZXhlYwkJPSAweDA7CiAgRE9TX0xPTC0+QlVGRkVSU192YWwJCT0gOTk7IC8qIG1heGltdW06IDk5ICovCiAgRE9TX0xPTC0+QlVGRkVSU19ucl9sb29rYWhlYWQJPSA4OyAvKiBtYXhpbXVtOiA4ICovCiAgRE9TX0xPTC0+Ym9vdF9kcml2ZQkJCT0gMzsgLyogQzogKi8KICBET1NfTE9MLT5mbGFnX0RXT1JEX21vdmVzCQk9IDB4MDE7IC8qIGkzODYrICovCiAgRE9TX0xPTC0+c2l6ZV9leHRlbmRlZF9tZW0JCT0gMHhmMDAwOyAvKiB2ZXJ5IGhpZ2ggdmFsdWUgKi8KfQoKdm9pZCBET1NERVZfSW5zdGFsbERPU0RldmljZXModm9pZCkKewogIERPU19EQVRBU0VHICpkYXRhc2VnOwogIFVJTlQxNiBzZWc7CiAgdW5zaWduZWQgaW50IG47CgogIC8qIGFsbG9jYXRlIERPUyBkYXRhIHNlZ21lbnQgb3Igc29tZXRoaW5nICovCiAgRE9TX0xPTFNlZyA9IEdsb2JhbERPU0FsbG9jMTYoc2l6ZW9mKERPU19EQVRBU0VHKSk7CiAgc2VnID0gSElXT1JEKERPU19MT0xTZWcpOwogIGRhdGFzZWcgPSBQVFJfU0VHX09GRl9UT19MSU4oTE9XT1JEKERPU19MT0xTZWcpLCAwKTsKCiAgLyogaW5pdGlhbGl6ZSB0aGUgbWFnbmlmaWNlbnQgTGlzdCBPZiBMaXN0cyAqLwogIEluaXRMaXN0T2ZMaXN0cygmZGF0YXNlZy0+bG9sKTsKCiAgLyogU2V0IHVwIGZpcnN0IGRldmljZSAoTlVMKSAqLwogIGRhdGFzZWctPmxvbC5OVUxfZGV2Lm5leHRfZGV2ICA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWcsIERPU19EQVRBU0VHX09GRihkZXZbMF0pKTsKICBkYXRhc2VnLT5sb2wuTlVMX2Rldi5hdHRyICAgICAgPSBkZXZzWzBdLmF0dHI7CiAgZGF0YXNlZy0+bG9sLk5VTF9kZXYuc3RyYXRlZ3kgID0gRE9TX0RBVEFTRUdfT0ZGKHRodW5rWzBdLmxqbXAxKTsKICBkYXRhc2VnLT5sb2wuTlVMX2Rldi5pbnRlcnJ1cHQgPSBET1NfREFUQVNFR19PRkYodGh1bmtbMF0ubGptcDIpOwogIG1lbWNweShkYXRhc2VnLT5sb2wuTlVMX2Rldi5uYW1lLCBkZXZzWzBdLm5hbWUsIDgpOwoKICAvKiBTZXQgdXAgdGhlIHJlbWFpbmluZyBkZXZpY2VzICovCiAgZm9yIChuID0gMTsgbiA8IE5SX0RFVlM7IG4rKykKICB7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5uZXh0X2RldiAgPSAobisxKSA9PSBOUl9ERVZTID8gTk9ORVhUIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWcsIERPU19EQVRBU0VHX09GRihkZXZbbl0pKTsKICAgIGRhdGFzZWctPmRldltuLTFdLmF0dHIgICAgICA9IGRldnNbbl0uYXR0cjsKICAgIGRhdGFzZWctPmRldltuLTFdLnN0cmF0ZWd5ICA9IERPU19EQVRBU0VHX09GRih0aHVua1tuXS5sam1wMSk7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5pbnRlcnJ1cHQgPSBET1NfREFUQVNFR19PRkYodGh1bmtbbl0ubGptcDIpOwogICAgbWVtY3B5KGRhdGFzZWctPmRldltuLTFdLm5hbWUsIGRldnNbbl0ubmFtZSwgOCk7CiAgfQoKICAvKiBTZXQgdXAgdGh1bmtzICovCiAgZm9yIChuID0gMDsgbiA8IE5SX0RFVlM7IG4rKykKICB7CiAgICBkYXRhc2VnLT50aHVua1tuXS5sam1wMSAgICAgPSBMSk1QOwogICAgZGF0YXNlZy0+dGh1bmtbbl0uc3RyYXRlZ3kgID0gKFJNQ0JQUk9DKURQTUlfQWxsb2NJbnRlcm5hbFJNQ0IoZGV2c1tuXS5zdHJhdGVneSk7CiAgICBkYXRhc2VnLT50aHVua1tuXS5sam1wMiAgICAgPSBMSk1QOwogICAgZGF0YXNlZy0+dGh1bmtbbl0uaW50ZXJydXB0ID0gKFJNQ0JQUk9DKURQTUlfQWxsb2NJbnRlcm5hbFJNQ0IoZGV2c1tuXS5pbnRlcnJ1cHQpOwogIH0KCiAgLyogQ09OIGlzIGRldmljZSAxICovCiAgZGF0YXNlZy0+bG9sLnB0cl9DT05fZGV2X2hkciA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihzZWcsIERPU19EQVRBU0VHX09GRihkZXZbMF0pKTsKfQoKRFdPUkQgRE9TREVWX0NvbnNvbGUodm9pZCkKewogIHJldHVybiBET1NNRU1fTE9MKCktPnB0cl9DT05fZGV2X2hkcjsKfQoKRFdPUkQgRE9TREVWX0ZpbmRDaGFyRGV2aWNlKGNoYXIqbmFtZSkKewogIFNFR1BUUiBjdXJfcHRyID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKEhJV09SRChET1NfTE9MU2VnKSwKCQkJCQkgRklFTERfT0ZGU0VUKERPU19MSVNUT0ZMSVNUUyxOVUxfZGV2KSk7CiAgRE9TX0RFVklDRV9IRUFERVIgKmN1ciA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoY3VyX3B0cik7CiAgY2hhciBkbmFtZVs4XTsKICBpbnQgY250OwoKICAvKiBnZXQgZmlyc3QgOCBjaGFyYWN0ZXJzICovCiAgc3RybmNweShkbmFtZSxuYW1lLDgpOwogIC8qIGlmIGxlc3MgdGhhbiA4IGNoYXJhY3RlcnMsIHBhZCB3aXRoIHNwYWNlcyAqLwogIGZvciAoY250PTA7IGNudDw4OyBjbnQrKykKICAgIGlmICghZG5hbWVbY250XSkgZG5hbWVbY250XT0nICc7CgogIC8qIHNlYXJjaCBmb3IgY2hhciBkZXZpY2VzIHdpdGggdGhlIHJpZ2h0IG5hbWUgKi8KICB3aGlsZSAoY3VyICYmCgkgKCghKGN1ci0+YXR0ciAmIEFUVFJfQ0hBUikpIHx8CgkgIG1lbWNtcChjdXItPm5hbWUsZG5hbWUsOCkpKSB7CiAgICBjdXJfcHRyID0gY3VyLT5uZXh0X2RldjsKICAgIGlmIChjdXJfcHRyID09IE5PTkVYVCkgY3VyPU5VTEw7CiAgICBlbHNlIGN1ciA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoY3VyX3B0cik7CiAgfQogIHJldHVybiBjdXJfcHRyOwp9CgpzdGF0aWMgdm9pZCBET1NERVZfRG9SZXEodm9pZCpyZXEsIERXT1JEIGRldikKewogIFJFUVVFU1RfSEVBREVSICpoZHIgPSAoUkVRVUVTVF9IRUFERVIgKilyZXE7CiAgRE9TX0RFVklDRV9IRUFERVIgKmRoZHI7CiAgQ09OVEVYVDg2IGN0eDsKICBjaGFyICpwaGRyOwoKICBkaGRyID0gRE9TTUVNX01hcFJlYWxUb0xpbmVhcihkZXYpOwogIHBoZHIgPSAoKGNoYXIqKURPU01FTV9MT0woKSkgKyBET1NfREFUQVNFR19PRkYocmVxKTsKCiAgLyogY29weSByZXF1ZXN0IHRvIHJlcXVlc3Qgc2NyYXRjaCBhcmVhICovCiAgbWVtY3B5KHBoZHIsIHJlcSwgaGRyLT5zaXplKTsKCiAgLyogcHJlcGFyZSB0byBjYWxsIGRldmljZSBkcml2ZXIgKi8KICBtZW1zZXQoJmN0eCwgMCwgc2l6ZW9mKGN0eCkpOwoKICAvKiBFUzpCWCBwb2ludHMgdG8gcmVxdWVzdCBmb3Igc3RyYXRlZ3kgcm91dGluZSAqLwogIGN0eC5TZWdFcyA9IEhJV09SRChET1NfTE9MU2VnKTsKICBjdHguRWJ4ICAgPSBET1NfREFUQVNFR19PRkYocmVxKTsKCiAgLyogY2FsbCBzdHJhdGVneSByb3V0aW5lICovCiAgY3R4LlNlZ0NzID0gU0VMRUNUT1JPRihkZXYpOwogIGN0eC5FaXAgICA9IGRoZHItPnN0cmF0ZWd5OwogIERQTUlfQ2FsbFJNUHJvYygmY3R4LCAwLCAwLCAwKTsKCiAgLyogY2FsbCBpbnRlcnJ1cHQgcm91dGluZSAqLwogIGN0eC5TZWdDcyA9IFNFTEVDVE9ST0YoZGV2KTsKICBjdHguRWlwICAgPSBkaGRyLT5pbnRlcnJ1cHQ7CiAgRFBNSV9DYWxsUk1Qcm9jKCZjdHgsIDAsIDAsIDApOwoKICAvKiBjb21wbGV0ZWQsIGNvcHkgcmVxdWVzdCBiYWNrICovCiAgbWVtY3B5KHJlcSwgcGhkciwgaGRyLT5zaXplKTsKCiAgaWYgKGhkci0+c3RhdHVzICYgU1RBVF9FUlJPUikgewogICAgc3dpdGNoIChoZHItPnN0YXR1cyAmIFNUQVRfTUFTSykgewogICAgY2FzZSAweDBGOiAvKiBpbnZhbGlkIGRpc2sgY2hhbmdlICovCiAgICAgIC8qIHRoaXMgZXJyb3Igc2VlbXMgdG8gZml0IHRoZSBiaWxsICovCiAgICAgIFNldExhc3RFcnJvcihFUl9Ob3RTYW1lRGV2aWNlKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBTZXRMYXN0RXJyb3IoKGhkci0+c3RhdHVzICYgU1RBVF9NQVNLKSArIDB4MTMpOwogICAgICBicmVhazsKICAgIH0KICB9Cn0KCnN0YXRpYyBpbnQgRE9TREVWX0lPKHVuc2lnbmVkIGNtZCwgRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICBSRVFfSU8gcmVxOwoKICByZXEuaGRyLnNpemU9c2l6ZW9mKHJlcSk7CiAgcmVxLmhkci51bml0PTA7IC8qIG5vdCBkZWFsaW5nIHdpdGggYmxvY2sgZGV2aWNlcyB5ZXQgKi8KICByZXEuaGRyLmNvbW1hbmQ9Y21kOwogIHJlcS5oZHIuc3RhdHVzPVNUQVRfQlVTWTsKICByZXEubWVkaWE9MDsgLyogbm90IGRlYWxpbmcgd2l0aCBibG9jayBkZXZpY2VzIHlldCAqLwogIHJlcS5idWZmZXI9YnVmOwogIHJlcS5jb3VudD1idWZsZW47CiAgcmVxLnNlY3Rvcj0wOyAvKiBibG9jayBkZXZpY2VzICovCiAgcmVxLnZvbHVtZT0wOyAvKiBibG9jayBkZXZpY2VzICovCgogIERPU0RFVl9Eb1JlcSgmcmVxLCBkZXYpOwoKICByZXR1cm4gcmVxLmNvdW50Owp9CgppbnQgRE9TREVWX1BlZWsoRFdPUkQgZGV2LCBCWVRFKmRhdGEpCnsKICBSRVFfU0FGRUlOUFVUIHJlcTsKCiAgcmVxLmhkci5zaXplPXNpemVvZihyZXEpOwogIHJlcS5oZHIudW5pdD0wOyAvKiBub3QgZGVhbGluZyB3aXRoIGJsb2NrIGRldmljZXMgeWV0ICovCiAgcmVxLmhkci5jb21tYW5kPUNNRF9TQUZFSU5QVVQ7CiAgcmVxLmhkci5zdGF0dXM9U1RBVF9CVVNZOwogIHJlcS5kYXRhPTA7CgogIERPU0RFVl9Eb1JlcSgmcmVxLCBkZXYpOwoKICBpZiAocmVxLmhkci5zdGF0dXMgJiBTVEFUX0JVU1kpIHJldHVybiAwOwoKICAqZGF0YSA9IHJlcS5kYXRhOwogIHJldHVybiAxOwp9CgppbnQgRE9TREVWX1JlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICByZXR1cm4gRE9TREVWX0lPKENNRF9JTlBVVCwgZGV2LCBidWYsIGJ1Zmxlbik7Cn0KCmludCBET1NERVZfV3JpdGUoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4sIGludCB2ZXJpZnkpCnsKICByZXR1cm4gRE9TREVWX0lPKHZlcmlmeT9DTURfU0FGRU9VVFBVVDpDTURfT1VUUFVULCBkZXYsIGJ1ZiwgYnVmbGVuKTsKfQoKaW50IERPU0RFVl9Jb2N0bFJlYWQoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICByZXR1cm4gRE9TREVWX0lPKENNRF9JTklPQ1RMLCBkZXYsIGJ1ZiwgYnVmbGVuKTsKfQoKaW50IERPU0RFVl9Jb2N0bFdyaXRlKERXT1JEIGRldiwgRFdPUkQgYnVmLCBpbnQgYnVmbGVuKQp7CiAgcmV0dXJuIERPU0RFVl9JTyhDTURfT1VUSU9DVEwsIGRldiwgYnVmLCBidWZsZW4pOwp9Cg==