LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqCiAqIFRob21hcyBGcmllZGVuIChUaG9tYXNGQGh5cGVyaW9uLWVudGVydGFpbm1lbnQuY29tKQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKgogKi8KI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgojaW5jbHVkZSA8YXNtL3N0cmluZy5oPgojaW5jbHVkZSA8ZGV2aWNlcy5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlICJtZW1pby5oIgojaW5jbHVkZSAiY2F0d2Vhc2VsLmgiCiNpbmNsdWRlICJjdzQuaCIKI2luY2x1ZGUgIi4uL21lbnUvbWVudS5oIgoKI2RlZmluZSBDQVRXX1BDSV9WRU5ET1IJCTB4ZTE1OQojZGVmaW5lIENBVFdfUENJX1BST0RVQ1QJMHgwMDAxCgojZGVmaW5lIENBVFc0X1NVQlNZU19WRU5ET1IJMHg1MjEzCiNkZWZpbmUgQ0FUVzRfU1VCU1lTX0lEMQkweDAwMDIKI2RlZmluZSBDQVRXNF9TVUJTWVNfSUQyCTB4MDAwMwoKI2RlZmluZSBDQVRXX0tFWV9EQVRBCQkweGQwCiNkZWZpbmUgQ0FUV19LRVlfU1RBVFVTCQkweGQ0CgojZGVmaW5lIENBVFdfS1NfUkVBRFkJCTB4ODAKCiNkZWZpbmUgQ0FUV19OQU1FCQkJImFtaWtiZCIKCiNkZWZpbmUgQ0FUVzRfRklMRUlECQlGaWxlSUQoJ0MnLCdBJywnVCcsJzQnKQoKI3VuZGVmIENBVFdfREVCVUcKI2lmZGVmCUNBVFdfREVCVUcKI2RlZmluZQlkcHJpbnRmKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQojZWxzZQojZGVmaW5lIGRwcmludGYoZm10LGFyZ3MuLi4pCiNlbmRpZgoKaW50IGNhdHdfZ2V0Yyh2b2lkKTsKaW50IGNhdHdfdGVzdGModm9pZCk7CgpzdGF0aWMgaW50IGNhdHdfcGNpID0gLTE7CnN0YXRpYyB1bnNpZ25lZCBsb25nIGNhdHdfaW9iYXNlID0gMDsKCnN0YXRpYyBpbnQgY2F0d19wb2xsX2RlbGF5ID0gMjAwMDA7CgpzdGF0aWMgY2hhciBjYXR3X3NoaWZ0X3N0YXRlID0gMDsKCnN0YXRpYyB1bnNpZ25lZCBjaGFyIGNhdHdfbm9ybWFsX3hsYXRlWzB4NzBdID0KeyAgICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLwovKiAwMCAtIDBGICovICdgJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsJ98nLCdcJycsJ1xcJywwLCAnMCcsCi8qIDEwIC0gMUYgKi8gJ3EnLCd3JywnZScsJ3InLCd0JywneicsJ3UnLCdpJywnbycsJ3AnLCf8JywnKycsIDAgLCcxJywnMicsJzMnLAovKiAyMCAtIDJGICovICdhJywncycsJ2QnLCdmJywnZycsJ2gnLCdqJywnaycsJ2wnLCf2Jywn5CcsJyMnLCAwICwnNCcsJzUnLCc2JywKLyogMzAgLSAzRiAqLyAnPCcsJ3knLCd4JywnYycsJ3YnLCdiJywnbicsJ20nLCcsJywnLicsJy0nLCAwICwgMCAsJzcnLCc4JywnOScsCi8qIDQwIC0gNEYgKi8gJyAnLCA4ICwgOSAsIDEzLCAxMywgMjcsMTI3LCAwICwgMCAsIDAgLCctJywgMCAsIDAgLCAwICwgMCAsIDAgLAovKiA1MCAtIDVGICovICAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwnWycsJ10nLCcvJywnKicsJysnLCAwICwKLyogNjAgLSA2RiAqLyAgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMAp9OwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgY2F0d19zaGlmdGVkX3hsYXRlWzB4NzBdID0KeyAgICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLwovKiAwMCAtIDBGICovICd+JywnIScsJyInLCenJywnJCcsJyUnLCcmJywnLycsJygnLCcpJywnPScsJz8nLCdgJywnfCcsIDAsICcwJywKLyogMTAgLSAxRiAqLyAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsJ9wnLCcqJywgMCAsJzEnLCcyJywnMycsCi8qIDIwIC0gMkYgKi8gJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsJ9YnLCfEJywnXicsIDAgLCc0JywnNScsJzYnLAovKiAzMCAtIDNGICovICc+JywnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsJzsnLCc6JywnXycsIDAgLCAwICwnNycsJzgnLCc5JywKLyogNDAgLSA0RiAqLyAnICcsIDggLCA5ICwgMTMsIDEzLCAyNywxMjcsIDAgLCAwICwgMCAsJy0nLCAwICwgMCAsIDAgLCAwICwgMCAsCi8qIDUwIC0gNUYgKi8gIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCd7JywnfScsJy8nLCcqJywnKycsIDAgLAovKiA2MCAtIDZGICovICAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwICwgMCAsIDAgLCAwCn07CgovLyIKCiNkZWZpbmUgQ0FUV19CVUZGRVJfU0laRSAyMApzdGF0aWMgdW5zaWduZWQgY2hhciBjYXR3X2J1ZmZlcltDQVRXX0JVRkZFUl9TSVpFXTsKc3RhdGljIGludCBjYXR3X2lucHRyID0gMCwgY2F0d19vdXRwdHIgPSAwOwoKdm9pZCBjYXR3X2hhbmRsZShpbnQgYykKewoJaW50IGt1cCA9IChjJjB4ODApOwoJaW50IGtleSA9IChjJjB4N2YpOwoJCglzd2l0Y2ggKGtleSkKCXsKCQljYXNlIDB4NjA6CgkJY2FzZSAweDYxOgoJCWNhc2UgMHg2MjoKCQkJaWYgKGt1cCkKCQkJCWNhdHdfc2hpZnRfc3RhdGUgPSAwOwoJCQllbHNlCgkJCQljYXR3X3NoaWZ0X3N0YXRlID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAweDc4OgoJCQkvKiBSZXNldCAqLwoJCQlkcHJpbnRmKCJSZXNldCFcbiIpOwoJCQlicmVhazsKCX0KfQoKaW50IGNhdHdfeGxhdGUoaW50IGMpCnsKCWMgJj0gMHg3ZjsKCQoJc3dpdGNoKGMpCgl7CgljYXNlIDB4NEM6CgkJcmV0dXJuIEtFWV9QUkVWX0lURU07CgljYXNlIDB4NEQ6CgkJcmV0dXJuIEtFWV9ORVhUX0lURU07CgljYXNlIDB4NEU6CgkJcmV0dXJuIEtFWV9ORVhUX09QVElPTjsKCWNhc2UgMHg0RjoKCQlyZXR1cm4gS0VZX1BSRVZfT1BUSU9OOwoJZGVmYXVsdDoKCQlpZiAoY2F0d19zaGlmdF9zdGF0ZSkKCQkJcmV0dXJuIGNhdHdfc2hpZnRlZF94bGF0ZVtjXTsKCQllbHNlCgkJCXJldHVybiBjYXR3X25vcm1hbF94bGF0ZVtjXTsKCX0KfQoKc3RhdGljIGludCBjYXR3X2ZwZ2FfcmVhZHkodm9pZCkKewoJaWYgKChpbl9ieXRlKGNhdHdfaW9iYXNlICsgMHgwNykgJiA4KSA9PSA4KSByZXR1cm4gMTsKCWVsc2UgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgY2F0d19jb25maWdfZG9uZSh2b2lkKQp7CglpZiAoKGluX2J5dGUoY2F0d19pb2Jhc2UgKyAweDA3KSAmIDQpID09IDQpIHJldHVybiAxOwoJZWxzZSByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY2F0d19yZXNldF9mcGdhKHZvaWQpCnsKCWRwcmludGYoIlJlc2V0dGluZyBmcGdhLi4uXG4iKTsKCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgwMiwgMjI3KTsKCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgwMywgMCk7Cgl1ZGVsYXkoMTAwMCk7CglvdXRfYnl0ZShjYXR3X2lvYmFzZSArIDB4MDMsIDY1KTsKCWRwcmludGYoIkRvbmVcbiIpOwp9CgpzdGF0aWMgdm9pZCAqY2F0d19nZXRfY29uZmlnKHVpbnQzMiAqc2l6ZSkKewoJKnNpemUgPSA1OTIxNTsKCXJldHVybiAmY3c0WzBdOwp9CgpzdGF0aWMgaW50IGNhdHdfcHJvZ3JhbV9mcGdhX2NvbmZpZyh2b2lkKQp7Cgl1aW50MzIgbGVuZ3RoOwoJdWludDggYjsKCWludCBpOwoJaW50IHRyeTsKCXVpbnQ4ICpjb25maWcgPSAodWludDgqKWNhdHdfZ2V0X2NvbmZpZygmbGVuZ3RoKTsKCQoJaWYgKCFjb25maWcpCgl7CgkJZHByaW50ZigiQ291bGRuJ3QgZmluZCBjb3JlIGNvbmZpZ1xuIik7CgkJcmV0dXJuIDA7Cgl9CgkKCSNpZmRlZiBDQVRXX0RFQlVHCglkcHJpbnRmKCJGb3VuZCBhIGNvbmZpZyBzdHJpbmcgb2YgJWQgYnl0ZXNcbiIsIGxlbmd0aCk7CglkcHJpbnRmKCJzdGFydGluZyB3aXRoLi4uXG4iKTsKCXsKCQlpbnQgaTsKCQlmb3IgKGk9MDsgaTw0MDsgaSsrKQoJCXsKCQkJZHByaW50ZigiJTAyeCAiLCAqKGNvbmZpZytpKSk7CgkJfQoJCWRwcmludGYoIlxuIik7CgkJZHByaW50ZigiLi4uXG4iKTsKCQkKCQlmb3IgKGk9MDsgaTw0MDsgaSsrKQoJCXsKCQkJZHByaW50ZigiJTAyeCAiLCAqKGNvbmZpZytsZW5ndGgtNDAraSkpOwoJCX0KCQlkcHJpbnRmKCJcbiIpOwoJfQoJI2VuZGlmCgkKCWZvciAoaT0wOyBpPGxlbmd0aC0xOyBpKyspCgl7CgkJYiA9ICooY29uZmlnK2kpOwoJCXRyeSA9IDA7CgkJCgkJaWYgKChiICYgMHgwMSkgPT0gMHgwMSkKCQkJb3V0X2J5dGUoY2F0d19pb2Jhc2UgKyAweDAzLCAweDQzKTsKCQllbHNlCgkJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgwMywgMHg0MSk7CgkJCgkJd2hpbGUgKGNhdHdfZnBnYV9yZWFkeSgpID09IDApIAoJCXsKCQkJdWRlbGF5KDIwMDApOwoJCQl0cnkrKzsKCQkJZHByaW50Zigid2FpdGluZyBmb3IgRlBHQSAodHJ5ID0gJWQpXG4iLCB0cnkpOwoJCQlpZiAodHJ5ID09IDEwKQoJCQl7CgkJCQlkcHJpbnRmKCJQQU5JQzogRlBHQSBmYWlsZWQgb24gY2F0d19mcGdhX3JlYWR5KClcbiIpOwoJCQkJZHByaW50ZigiYXQgYnl0ZSBvZmZzZXQgJWRcbiIsIGkpOwoJCQkJZHByaW50ZigiYnl0ZSB3cml0dGVuIHdhcyAlMDJ4XG4iLCBiKTsKCQkJCXJldHVybiAwOwoJCQl9CgkJfQoJCQoJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHhjMCwgYik7Cgl9CgkKCXJldHVybiAxOwp9CgkKCmludCBjYXR3X2tiX2luaXQodm9pZCkKewoJaW50IGk7CglkZXZpY2VfdCBjYXR3X2tiZGRldjsKCWludCBlcnJvcjsKCWNoYXIgKnM7Cgl1aW50MTYgc3Vic3lzX3ZlbmRvciwgc3Vic3lzX2RldmljZTsKCgkvKiBTb21lIGluaXQgKi8KCWNhdHdfc2hpZnRfc3RhdGUgPSAwOwoKCS8qIEZpbmQgdGhlIGRldmljZSAqLwoJY2F0d19wY2kgPSBwY2lfZmluZF9kZXZpY2UoQ0FUV19QQ0lfVkVORE9SLCBDQVRXX1BDSV9QUk9EVUNULCAwKTsKCWlmIChjYXR3X3BjaSA9PSAtMSkKCXsKCQlkcHJpbnRmKCJObyBDYXR3ZWFzZWwgY29udHJvbGxlciAoMHglMHg0LCAweCUwNHgpIGF0dGFjaGVkXG4iLCBDQVRXX1BDSV9WRU5ET1IsIENBVFdfUENJX1BST0RVQ1QpOwoJCXJldHVybiAtMTsKCX0KCQoJLyogR2V0IElPIGJhc2UgKi8KCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCgl7CgkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGNhdHdfcGNpLCBQQ0lfQkFTRV9BRERSRVNTXzArNCppLCAodTMyICopJmNhdHdfaW9iYXNlKTsKCQlpZiAoY2F0d19pb2Jhc2UgJiAxKQoJCXsKCQkJLyogRm91bmQgdGhlIElPIGJhc2UgKi8KCQkJYnJlYWs7CgkJfQoJfQoJCgkvKiBDaGVjayB0aGUgaW9iYXNlICovCglpZiAoY2F0d19pb2Jhc2UgJiAxKQoJewoJCWNhdHdfaW9iYXNlICY9IH4xOwoJCWRwcmludGYoIkkvTyBiYXNlOiAlcFxuIiwgKHUzMiAqKWNhdHdfaW9iYXNlKTsKCX0KCWVsc2UKCXsKCQlwcmludGYoIkVycm9yOiBVbmFibGUgdG8gZmluZCBJL08gYWRkcmVzcyByYW5nZVxuIik7CgkJcmV0dXJuIC0xOwoJfQoJCglwY2lfcmVhZF9jb25maWdfd29yZChjYXR3X3BjaSwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXNfdmVuZG9yKTsKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNhdHdfcGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmc3Vic3lzX2RldmljZSk7CgkKCWlmIChzdWJzeXNfdmVuZG9yID09IENBVFc0X1NVQlNZU19WRU5ET1IgJiYgCgkgICAoKHN1YnN5c19kZXZpY2UgPT0gQ0FUVzRfU1VCU1lTX0lEMSkgfHwgKHN1YnN5c19kZXZpY2UgPT0gQ0FUVzRfU1VCU1lTX0lEMSkpKQoJewoJCWRwcmludGYoIkNhdHdlYXNlbCBNYXJrIElWIGRldGVjdGVkXG4iKTsKCQkvKiBTZW5kIE1hcmsgSVYgaW5pdGlhbGlzYXRpb24gc2VxdWVuY2UgKi8KCQlvdXRfYnl0ZShjYXR3X2lvYmFzZSArIDB4MDAsIDB4RjEpOwoJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgwMSwgMHgwMCk7CgkJb3V0X2J5dGUoY2F0d19pb2Jhc2UgKyAweDAyLCAweEUzKTsKCQlvdXRfYnl0ZShjYXR3X2lvYmFzZSArIDB4MDMsIDB4NDEpOwoJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgwNCwgMHgwMCk7CgkJb3V0X2J5dGUoY2F0d19pb2Jhc2UgKyAweDA1LCAweDAwKTsKCQlvdXRfYnl0ZShjYXR3X2lvYmFzZSArIDB4MjksIDB4MDApOwoJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgyQiwgMHgwMCk7CgkJCgkJI2lmZGVmIENBVFdfREVCVUcKCQlpZiAoY2F0d19jb25maWdfZG9uZSgpKQoJCQlkcHJpbnRmKCJGUEdBIGFscmVhZHkgY29uZmlndXJlZFxuIik7CgkJZWxzZQoJCQlkcHJpbnRmKCJGUEdBIEVtcHR5XG4iKTsKCQkjZW5kaWYKCQkKCQljYXR3X3Jlc2V0X2ZwZ2EoKTsKCQlpZiAoY2F0d19jb25maWdfZG9uZSgpKQoJCXsKCQkJcHJpbnRmKCIqKlBBTklDKiogRlBHQSByZXNldCBmYWlsZWRcbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCSNpZmRlZiBDQVRXX0RFQlVHCgkJZWxzZQoJCXsKCQkJZHByaW50ZigiRlBHQSByZXNldCBPS1xuIik7CgkJfQoJCSNlbmRpZgoJCQoJCWlmICgwID09IGNhdHdfcHJvZ3JhbV9mcGdhX2NvbmZpZygpKQoJCXsKCQkJcHJpbnRmKCIqKkVSUk9SKiogRlBHQSBQcm9ncmFtbWluZyBmYWlsZWRcbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCQoJCWlmIChjYXR3X2NvbmZpZ19kb25lKCkpCgkJewoJCQlwcmludGYoIkNhdHdlYXNlbCBNYXJrIElWIGNvbmZpZ3VyZWRcblxuIik7CgkJfQoJCWVsc2UKCQl7CgkJCXByaW50ZigiKipFUlJPUioqIENhdHdlYXNlbCBNYXJrIElWIGNvbmZpZ3VyYXRpb24gZmFpbGVkXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQl1ZGVsYXkoMTAwMCk7Cgl9CgkvKiBDYXR3ZWFzZWwgbWFyayBJSUkgY2Fubm90IHdvcmsgb24gU2FtCgkgKiBpdCdzIGEgKzVWIG9ubHkgUENJIGNhcmQuLi4KCWVsc2UKCXsKCQlkcHJpbnRmKCJDYXR3ZWFzZWwgTWFyayBJSUkgZGV0ZWN0ZWRcbiIpOwoJCS8vIFNlbmQgaW5pdGlhbGlzYXRpb24gc2VxdWVuY2UgZm9yIE1hcmsgSUlJCgkJb3V0X2J5dGUoY2F0d19pb2Jhc2UgKyAweDAwLCAweGYxKTsKCQlvdXRfYnl0ZShjYXR3X2lvYmFzZSArIDB4MDEsIDB4MDApOwoJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgwMiwgMHgwMCk7CgkJb3V0X2J5dGUoY2F0d19pb2Jhc2UgKyAweDA0LCAweDAwKTsKCQlvdXRfYnl0ZShjYXR3X2lvYmFzZSArIDB4MDUsIDB4MDApOwoJCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgMHgyOSwgMHgwMCk7CgkJb3V0X2J5dGUoY2F0d19pb2Jhc2UgKyAweDJiLCAweDAwKTsKCX0KCSovCgkKCW91dF9ieXRlKGNhdHdfaW9iYXNlICsgQ0FUV19LRVlfREFUQSwgMCk7CgkKCS8qIFJlZ2lzdGVyIHVzIGFzIGEgcG9zc2libGUga2V5Ym9hcmQgZGV2aWNlICovCgltZW1zZXQoJmNhdHdfa2JkZGV2LCAwLCBzaXplb2YoY2F0d19rYmRkZXYpKTsKCXN0cmNweShjYXR3X2tiZGRldi5uYW1lLCBDQVRXX05BTUUpOwoJY2F0d19rYmRkZXYuZmxhZ3MgPSAgREVWX0ZMQUdTX0lOUFVUIHwgREVWX0ZMQUdTX1NZU1RFTTsKICAJY2F0d19rYmRkZXYucHV0YyA9IE5VTEw7CgljYXR3X2tiZGRldi5wdXRzID0gTlVMTDsKCWNhdHdfa2JkZGV2LmdldGMgPSBjYXR3X2dldGM7CgljYXR3X2tiZGRldi50c3RjID0gY2F0d190ZXN0YzsKCQoJcyA9IGdldGVudigiY2F0d19wb2xsX2RlbGF5Iik7CglpZiAocykgCgl7CgkJY2F0d19wb2xsX2RlbGF5ID0gc2ltcGxlX3N0cnRvbChzLCBOVUxMLCAwKSAqIDEwMDA7Cgl9CgoJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJmNhdHdfa2JkZGV2KTsKCWlmICgwID09IGVycm9yICkKCXsKCQkvKiBDaGVjayBpZiB3ZSBhcmUgc3RkaW4gKi8KCQlpZiAoMCA9PSBzdHJjbXAoZ2V0ZW52KCJzdGRpbiIpLCBDQVRXX05BTUUpKQoJCXsKCQkJaWYgKG92ZXJ3cml0ZV9jb25zb2xlKCkpCgkJCQlyZXR1cm4gMTsKCQkJCQoJCQllcnJvciA9IGNvbnNvbGVfYXNzaWduKHN0ZGluLENBVFdfTkFNRSk7CgkJCWlmICgwID09IGVycm9yKQoJCQl7CgkJCQlkcHJpbnRmKCJDYXR3ZWFzZWwga2V5Ym9hcmQgaW5pdGlhbGl6ZWQgMVxuIik7CgkJCQlyZXR1cm4gMTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRwcmludGYoIkNhdHdlYXNlbCBrZXlib2FyZCBpbml0aWFsaXplZCAyXG4iKTsKCQkJCXJldHVybiBlcnJvcjsKCQkJfQoJCX0KCgkJZHByaW50ZigiQ2F0d2Vhc2VsIGtleWJvYXJkIGluaXRpYWxpemVkIDNcbiIpOwoJCXJldHVybiAxOwoJfQoJCglyZXR1cm4gZXJyb3I7Cn0KCnN0YXRpYyB2b2lkIGNhdHdfcHVzaCh1bnNpZ25lZCBjaGFyIGMpCnsKCWlmIChjYXR3X2lucHRyID09IENBVFdfQlVGRkVSX1NJWkUtMSkKCXsKCQlpZiAoY2F0d19vdXRwdHIgPT0gMCkgcmV0dXJuOwoJCWNhdHdfaW5wdHIgPSAwOwoJfQoJZWxzZSBpZiAoY2F0d19pbnB0ciArIDEgPT0gY2F0d19vdXRwdHIpCgl7CgkJcmV0dXJuOwoJfQoJCgljYXR3X2J1ZmZlclsrK2NhdHdfaW5wdHJdID0gYzsKfQoKc3RhdGljIGludCBjYXR3X3BvcCh2b2lkKQp7CglpZiAoY2F0d19pbnB0ciA9PSBjYXR3X291dHB0cikgcmV0dXJuIC0xOwoJaWYgKGNhdHdfb3V0cHRyID49IENBVFdfQlVGRkVSX1NJWkUtMSkKCQljYXR3X291dHB0ciA9IDA7CgllbHNlCgkJKytjYXR3X291dHB0cjsKCQkKCXJldHVybiAoaW50KWNhdHdfYnVmZmVyW2NhdHdfb3V0cHRyXTsKfQoKc3RhdGljIHZvaWQgY2F0d19wb2xsKHZvaWQpCnsKCWludCB4OwoJCgl4ID0gaW5fYnl0ZShjYXR3X2lvYmFzZSArIENBVFdfS0VZX1NUQVRVUyk7CgoJaWYgKHggJiBDQVRXX0tTX1JFQURZKQoJewoJCXggPSBpbl9ieXRlKGNhdHdfaW9iYXNlICsgQ0FUV19LRVlfREFUQSk7CgkJZHByaW50ZigiZ290IGNoYXI6ICV4XG4iLCB4KTsKCQljYXR3X2hhbmRsZSh4KTsKCQkKCQlpZiAoISh4JjB4ODApKQoJCXsKCQkJeCA9IGNhdHdfeGxhdGUoeCk7CgkJCWlmICh4KQoJCQl7CgkJCQlkcHJpbnRmKCJ4bGF0ZTogJXhcbiIsIHgpOwoJCQkJY2F0d19wdXNoKCh1bnNpZ25lZCBjaGFyKXgpOwoJCQl9CgkJfQoJCXVkZWxheSgxMDAwKTsKCQlvdXRfYnl0ZShjYXR3X2lvYmFzZSArIENBVFdfS0VZX0RBVEEsIDApOwoJfQp9CgkKaW50IGNhdHdfZ2V0Yyh2b2lkKQp7CglpbnQgYzsKCQoJZG8KCXsKCQl1ZGVsYXkoY2F0d19wb2xsX2RlbGF5KTsKCQljYXR3X3BvbGwoKTsKCQljID0gY2F0d19wb3AoKTsKCX0gd2hpbGUgKGMgPT0gLTEpOwoKCXJldHVybiBjOwp9CQoJCnVuc2lnbmVkIGxvbmcgbG9uZyBnZXRfdGlja3Modm9pZCk7CnVuc2lnbmVkIGxvbmcgdGlja3MydXNlYyh1bnNpZ25lZCBsb25nIHRpY2tzKTsKCmludCBjYXR3X3Rlc3RjKHZvaWQpCnsKCWNhdHdfcG9sbCgpOwoJaWYgKGNhdHdfaW5wdHIgPT0gY2F0d19vdXRwdHIpIHJldHVybiAwOwoJZWxzZSByZXR1cm4gMTsKfQo=