I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInNtY29tbW9uLmgiCiNpbmNsdWRlICJzbWlsLmgiCgppbnQgICAgICAgICBDaGVja19EX0xvZ0NIUyAgICAgICAgICAgICAgKFdPUkQgKixCWVRFICosQllURSAqKTsKdm9pZCAgICAgICAgSW5pdGlhbGl6ZV9EX01lZGlhICAgICAgICAgICh2b2lkKTsKdm9pZCAgICAgICAgUG93ZXJPZmZfRF9NZWRpYSAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVBvd2VyICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUV4aXN0ICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYVdQICAgICAgICAgICAgICh2b2lkKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdCAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICAgICAgICAgQ29udl9EX01lZGlhQWRkciAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBEV09SRCk7CmludCAgICAgICAgIEluY19EX01lZGlhQWRkciAgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgICAgICAgIENoZWNrX0RfRmlyc3RTZWN0ICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIENoZWNrX0RfTGFzdFNlY3QgICAgICAgICAgICAodm9pZCk7CmludCAgICAgICAgIE1lZGlhX0RfUmVhZE9uZVNlY3QgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKiwgV09SRCwgQllURSAqKTsKaW50ICAgICAgICAgTWVkaWFfRF9Xcml0ZU9uZVNlY3QgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja0hlYWQgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0NvcHlCbG9ja1RhaWwgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlT25lQmxvY2sgICAgICAgKHZvaWQpOwppbnQgICAgICAgICBNZWRpYV9EX0VyYXNlQWxsQmxvY2sgICAgICAgKHZvaWQpOwoKaW50ICBDb3B5X0RfQmxvY2tBbGwgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIERXT1JEKTsKaW50ICBDb3B5X0RfQmxvY2tIZWFkICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIENvcHlfRF9CbG9ja1RhaWwgICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVhc3NpZ25fRF9CbG9ja0hlYWQgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQXNzaWduX0RfV3JpdGVCbG9jayAgICAgICAgICh2b2lkKTsKaW50ICBSZWxlYXNlX0RfUmVhZEJsb2NrICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwppbnQgIFJlbGVhc2VfRF9Xcml0ZUJsb2NrICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgUmVsZWFzZV9EX0NvcHlTZWN0b3IgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKCmludCAgQ29weV9EX1BoeU9uZVNlY3QgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBSZWFkX0RfUGh5T25lU2VjdCAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICosIFdPUkQsIEJZVEUgKik7CmludCAgV3JpdGVfRF9QaHlPbmVTZWN0ICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqLCBXT1JELCBCWVRFICopOwppbnQgIEVyYXNlX0RfUGh5T25lQmxvY2sgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgppbnQgIFNldF9EX1BoeUZtdFZhbHVlICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CmludCAgU2VhcmNoX0RfQ0lTICAgICAgICAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqKTsKaW50ICBNYWtlX0RfTG9nVGFibGUgICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICopOwp2b2lkIENoZWNrX0RfQmxvY2tJc0Z1bGwgICAgICAgICAodm9pZCk7CgppbnQgIE1hcmtGYWlsX0RfUGh5T25lQmxvY2sgICAgICAoc3RydWN0IHVzX2RhdGEgKik7CgpEV09SRCBFcnJYRENvZGU7CkRXT1JEIEVyckNvZGU7Ci8vQllURSAgU2VjdEJ1ZltTRUNUU0laRV07CkJZVEUgIFdvcmtCdWZbU0VDVFNJWkVdOwpCWVRFICBSZWR1bmRhbnRbUkVEVFNJWkVdOwpCWVRFICBXb3JrUmVkdW5kW1JFRFRTSVpFXTsKLy9XT1JEICBMb2cyUGh5W01BWF9aT05FTlVNXVtNQVhfTE9HQkxPQ0tdOwpXT1JEICAqTG9nMlBoeVtNQVhfWk9ORU5VTV07ICAgICAgICAgICAgICAgICAvLyAxMjggeCAxMDAwLCAgIExvZzJQaHlbTUFYX1pPTkVOVU1dW01BWF9MT0dCTE9DS107CkJZVEUgIEFzc2lnbltNQVhfWk9ORU5VTV1bTUFYX0JMT0NLTlVNLzhdOwpXT1JEICBBc3NpZ25TdGFydFtNQVhfWk9ORU5VTV07CldPUkQgIFJlYWRCbG9jazsKV09SRCAgV3JpdGVCbG9jazsKRFdPUkQgTWVkaWFDaGFuZ2U7CkRXT1JEIFNlY3RDb3B5TW9kZTsKCmV4dGVybiBzdHJ1Y3QgU1NGRENUWVBFICBTc2ZkYzsKZXh0ZXJuIHN0cnVjdCBBRERSRVNTICAgIE1lZGlhOwpleHRlcm4gc3RydWN0IENJU19BUkVBICAgQ2lzQXJlYTsKCi8vQklUIENvbnRyb2xsIE1hY3JvCkJZVEUgQml0RGF0YVtdID0geyAweDAxLDB4MDIsMHgwNCwweDA4LDB4MTAsMHgyMCwweDQwLDB4ODAgfSA7CiNkZWZpbmUgU2V0X0RfQml0KGEsYikgICAgKGFbKEJZVEUpKChiKS84KV18PSBCaXREYXRhWyhiKSU4XSkKI2RlZmluZSBDbHJfRF9CaXQoYSxiKSAgICAoYVsoQllURSkoKGIpLzgpXSY9fkJpdERhdGFbKGIpJThdKQojZGVmaW5lIENoa19EX0JpdChhLGIpICAgIChhWyhCWVRFKSgoYikvOCldICYgQml0RGF0YVsoYiklOF0pCgovL2V4dGVybiBQQllURSAgICBTTUhvc3RBZGRyOwpleHRlcm4gQllURSAgICAgSXNTU0ZEQ0NvbXBsaWFuY2U7CmV4dGVybiBCWVRFICAgICBJc1hEQ29tcGxpYW5jZTsKCgovLwovLy8vUG93ZXIgQ29udHJvbGwgJiBNZWRpYSBFeGlzdCBDaGVjayBGdW5jdGlvbgovLy8vLS0tLS0gSW5pdF9EX1NtYXJ0TWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBJbml0X0RfU21hcnRNZWRpYSh2b2lkKQovL3sKLy8gICAgaW50ICAgICBpOwovLwovLyAgICBFTUNSX1ByaW50KCJJbml0X0RfU21hcnRNZWRpYSBzdGFydFxuIik7Ci8vICAgIGZvciAoaT0wOyBpPE1BWF9aT05FTlVNOyBpKyspCi8vICAgIHsKLy8gICAgICAgIGlmIChMb2cyUGh5W2ldIT1OVUxMKQovLyAgICAgICAgewovLyAgICAgICAgICAgIEVNQ1JfUHJpbnQoIkV4RnJlZVBvb2wgWm9uZSA9ICV4LCBBZGRyID0gJXhcbiIsIGksIExvZzJQaHlbaV0pOwovLyAgICAgICAgICAgIEV4RnJlZVBvb2woTG9nMlBoeVtpXSk7Ci8vICAgICAgICAgICAgTG9nMlBoeVtpXSA9IE5VTEw7Ci8vICAgICAgICB9Ci8vICAgIH0KLy8KLy8gICAgSW5pdGlhbGl6ZV9EX01lZGlhKCk7Ci8vICAgIHJldHVybihOT19FUlJPUik7Ci8vfQoKLy8tLS0tLSBTTV9GcmVlTWVtKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU01fRnJlZU1lbSh2b2lkKQp7CglpbnQJaTsKCglwcmludGsoIlNNX0ZyZWVNZW0gc3RhcnRcbiIpOwoJZm9yIChpPTA7IGk8TUFYX1pPTkVOVU07IGkrKykKCXsKCQlpZiAoTG9nMlBoeVtpXSE9TlVMTCkKCQl7CgkJCXByaW50aygiRnJlZSBab25lID0gJXgsIEFkZHIgPSAlcFxuIiwgaSwgTG9nMlBoeVtpXSk7CgkJCWtmcmVlKExvZzJQaHlbaV0pOwoJCQlMb2cyUGh5W2ldID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4oTk9fRVJST1IpOwp9CgovLy8vLS0tLS0gUHdvZmZfRF9TbWFydE1lZGlhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBQd29mZl9EX1NtYXJ0TWVkaWEodm9pZCkKLy97Ci8vICAgIFBvd2VyT2ZmX0RfTWVkaWEoKTsKLy8gICAgcmV0dXJuKE5PX0VSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX1NtYXJ0TWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfU21hcnRNZWRpYSh2b2lkKQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFFeGlzdCgpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfUGFyYW1ldGVyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9QYXJhbWV0ZXIoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCxXT1JEICpwY3lsLEJZVEUgKnBoZWFkLEJZVEUgKnBzZWN0KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdChmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9Mb2dDSFMocGN5bCxwaGVhZCxwc2VjdCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIHJldHVybihOT19FUlJPUik7Ci8vfQoKLy9TbWFydE1lZGlhIFJlYWQvV3JpdGUvRXJhc2UgRnVuY3Rpb24KLy8tLS0tLSBNZWRpYV9EX1JlYWRTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1JlYWRTZWN0b3Ioc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBzdGFydCxXT1JEIGNvdW50LEJZVEUgKmJ1ZikKewoJV09SRCBsZW4sIGJuOwoKCS8vaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKSAgICAgICAgOyCmYiA2MjUwIGRvbid0IGNhcmUKCS8vICAgIHJldHVybihFcnJDb2RlKTsKCS8vaWYgKENoZWNrX0RfTWVkaWFGbXQoZmRvRXh0KSkgICAgOwoJLy8gICAgcmV0dXJuKEVyckNvZGUpOwoJaWYgKENvbnZfRF9NZWRpYUFkZHIodXMsIHN0YXJ0KSkKCQlyZXR1cm4oRXJyQ29kZSk7CgoJd2hpbGUoMSkKCXsKCQlsZW4gPSBTc2ZkYy5NYXhTZWN0b3JzIC0gTWVkaWEuU2VjdG9yOwoJCWlmIChjb3VudCA+IGxlbikKCQkJYm4gPSBsZW47CgkJZWxzZQoJCQlibiA9IGNvdW50OwoJCS8vaWYgKE1lZGlhX0RfUmVhZE9uZVNlY3QoZmRvRXh0LCBTZWN0QnVmKSkKCQkvL2lmIChNZWRpYV9EX1JlYWRPbmVTZWN0KGZkb0V4dCwgY291bnQsIGJ1ZikpCgkJaWYgKE1lZGlhX0RfUmVhZE9uZVNlY3QodXMsIGJuLCBidWYpKQoJCXsKCQkJRXJyQ29kZSA9IEVSUl9FY2NSZWFkRXJyOwoJCQlyZXR1cm4oRXJyQ29kZSk7CgkJfQoKCQlNZWRpYS5TZWN0b3IgKz0gYm47CgkJY291bnQgLT0gYm47CgoJCWlmIChjb3VudDw9MCkKCQkJYnJlYWs7CgoJCWJ1ZiArPSBibiAqIFNFQ1RTSVpFOwoKCQlpZiAoSW5jX0RfTWVkaWFBZGRyKHVzKSkKCQkJcmV0dXJuKEVyckNvZGUpOwoJfQoKCXJldHVybihOT19FUlJPUik7Cn0KLy8gaGVyZQovLy0tLS0tIE1lZGlhX0RfQ29weVNlY3RvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9Db3B5U2VjdG9yKHN0cnVjdCB1c19kYXRhICp1cywgRFdPUkQgc3RhcnQsV09SRCBjb3VudCxCWVRFICpidWYpCnsKCS8vRFdPUkQgbW9kZTsKCS8vaW50IGk7CglXT1JEIGxlbiwgYm47CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgkvL3ByaW50aygiTWVkaWFfRF9Db3B5U2VjdG9yICEhIVxuIik7CglpZiAoQ29udl9EX01lZGlhQWRkcih1cywgc3RhcnQpKQoJCXJldHVybihFcnJDb2RlKTsKCgl3aGlsZSgxKQoJewoJCWlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCgkJCXJldHVybihFUlJPUik7CgoJCWxlbiA9IFNzZmRjLk1heFNlY3RvcnMgLSBNZWRpYS5TZWN0b3I7CgkJaWYgKGNvdW50ID4gbGVuKQoJCQlibiA9IGxlbjsKCQllbHNlCgkJYm4gPSBjb3VudDsKCgkJLy9pZiAoU3NmZGNfRF9Db3B5QmxvY2soZmRvRXh0LGNvdW50LGJ1ZixSZWR1bmRhbnQpKQoJCWlmIChTc2ZkY19EX0NvcHlCbG9jayh1cyxibixidWYsUmVkdW5kYW50KSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKCQkJcmV0dXJuKEVyckNvZGUpOwoJCX0KCgkJTWVkaWEuU2VjdG9yID0gMHgxRjsKCQkvL2lmIChSZWxlYXNlX0RfUmVhZEJsb2NrKGZkb0V4dCkpCgkJaWYgKFJlbGVhc2VfRF9Db3B5U2VjdG9yKHVzKSkKCQl7CgkJCWlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKCQkJewoJCQkJRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwoJCQkJcmV0dXJuKEVyckNvZGUpOwoJCQl9CgkJfQoJCWNvdW50IC09IGJuOwoKCQlpZiAoY291bnQ8PTApCgkJCWJyZWFrOwoKCQlidWYgKz0gYm4gKiBTRUNUU0laRTsKCgkJaWYgKEluY19EX01lZGlhQWRkcih1cykpCgkJCXJldHVybihFcnJDb2RlKTsKCgl9CglyZXR1cm4oTk9fRVJST1IpOwp9CgovLy0tLS0tIFJlbGVhc2VfRF9Db3B5U2VjdG9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBSZWxlYXNlX0RfQ29weVNlY3RvcihzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdPVdyaXRlQmxvY2s7CglNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CgoJaWYgKE1lZGlhLlBoeUJsb2NrPT1OT19BU1NJR04pCgl7CgkJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCQlyZXR1cm4oU1VDQ0VTUyk7Cgl9CgoJQ2xyX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7CglNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoKCXJldHVybihTVUNDRVNTKTsKfQovKgovLy0tLS0tIE1lZGlhX0RfV3JpdGVTZWN0b3IoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfV3JpdGVTZWN0b3IoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgRFdPUkQgc3RhcnQsV09SRCBjb3VudCxCWVRFICpidWYpCnsKICAgIGludCBpOwogICAgV09SRCBsZW4sIGJuOwogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICAvL2lmIChDaGVja19EX01lZGlhUG93ZXIoKSkKICAgIC8vICAgIHJldHVybihFcnJDb2RlKTsKICAgIC8vCiAgICAvL2lmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpCiAgICAvLyAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAvLwogICAgLy9pZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCiAgICAvLyAgICByZXR1cm4oRXJyQ29kZSk7CgogICAgaWYgKENvbnZfRF9NZWRpYUFkZHIoZmRvRXh0LCBzdGFydCkpCiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIC8vRU5FX1ByaW50KCJNZWRpYV9EX1dyaXRlU2VjdG9yIC0tLSBTZWN0b3IgPSAleFxuIiwgTWVkaWEuU2VjdG9yKTsKICAgIGlmIChDaGVja19EX0ZpcnN0U2VjdCgpKQogICAgewogICAgICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja0hlYWQoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgICAgIH0KICAgIH0KCiAgICB3aGlsZSgxKQogICAgewogICAgICAgIGlmICghQ2hlY2tfRF9GaXJzdFNlY3QoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCiAgICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAgICAgfQoKICAgICAgICBsZW4gPSBTc2ZkYy5NYXhTZWN0b3JzIC0gTWVkaWEuU2VjdG9yOwogICAgICAgIGlmIChjb3VudCA+IGxlbikKICAgICAgICAgICBibiA9IGxlbjsKICAgICAgICBlbHNlCiAgICAgICAgICAgYm4gPSBjb3VudDsKICAgICAgICAvL2ZvcihpPTA7aTxTRUNUU0laRTtpKyspCiAgICAgICAgLy8gICAgU2VjdEJ1ZltpXT0qYnVmKys7CgogICAgICAgIC8vaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCiAgICAgICAgaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgYm4sIGJ1ZikpCiAgICAgICAgewogICAgICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKICAgICAgICB9CgogICAgICAgIE1lZGlhLlNlY3RvciArPSBibiAtIDE7CgogICAgICAgIGlmICghQ2hlY2tfRF9MYXN0U2VjdCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKCiAgICAgICAgICAgIHsgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNvdW50IC09IGJuOwoKICAgICAgICBpZiAoY291bnQ8PTApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBidWYgKz0gYm4gKiBTRUNUU0laRTsKCiAgICAgICAgLy9pZiAoLS1jb3VudDw9MCkKICAgICAgICAvLyAgICBicmVhazsKCiAgICAgICAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQogICAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICB9CgogICAgaWYgKCFDaGVja19EX0xhc3RTZWN0KCkpCiAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKCiAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwoKICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja1RhaWwoZmRvRXh0KSkKICAgIHsKICAgICAgICBFcnJDb2RlID0gRVJSX1dyaXRlRmF1bHQ7CiAgICAgICAgcmV0dXJuKEVyckNvZGUpOwogICAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZUJsb2NrKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIERXT1JEIHN0YXJ0LFdPUkQgY291bnQpCi8vewovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhV1AoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKENvbnZfRF9NZWRpYUFkZHIoc3RhcnQpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICB3aGlsZShDaGVja19EX0ZpcnN0U2VjdCgpKSB7Ci8vICAgICAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICAgICAgaWYgKC0tY291bnQ8PTApCi8vICAgICAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKLy8gICAgfQovLwovLyAgICB3aGlsZSgxKSB7Ci8vICAgICAgICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKLy8gICAgICAgICAgICBpZiAoTWVkaWFfRF9FcmFzZU9uZUJsb2NrKCkpCi8vICAgICAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKLy8gICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwovLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICBpZiAoSW5jX0RfTWVkaWFBZGRyKGZkb0V4dCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICAgICAgaWYgKC0tY291bnQ8PTApCi8vICAgICAgICAgICAgcmV0dXJuKE5PX0VSUk9SKTsKLy8gICAgfQovL30KLy8KLy8vLy0tLS0tIE1lZGlhX0RfRXJhc2VBbGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgTWVkaWFfRF9FcmFzZUFsbChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQovL3sKLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYUZtdEZvckVyYXNlQWxsKGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGlmIChDaGVja19EX01lZGlhV1AoKSkKLy8gICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gICAgaWYgKE1lZGlhX0RfRXJhc2VBbGxCbG9jaygpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICByZXR1cm4oTk9fRVJST1IpOwovL30KCi8vU21hcnRNZWRpYSBXcml0ZSBGdW5jdGlvbiBmb3IgT25lIFNlY3RvciBXcml0ZSBNb2RlCi8vLS0tLS0gTWVkaWFfRF9PbmVTZWN0V3JpdGVTdGFydCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9PbmVTZWN0V3JpdGVTdGFydChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LERXT1JEIHN0YXJ0LEJZVEUgKmJ1ZikKewovLyAgaW50IGk7Ci8vICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgLy9pZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCi8vICAvLyAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAvL2lmIChDaGVja19EX01lZGlhRm10KGZkb0V4dCkpCi8vICAvLyAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICAvL2lmIChDaGVja19EX01lZGlhV1AoKSkKLy8gIC8vICAgIHJldHVybihFcnJDb2RlKTsKLy8gIGlmIChDb252X0RfTWVkaWFBZGRyKGZkb0V4dCwgc3RhcnQpKQovLyAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gIGlmIChDaGVja19EX0ZpcnN0U2VjdCgpKQovLyAgICAgIGlmIChNZWRpYV9EX0NvcHlCbG9ja0hlYWQoZmRvRXh0KSkKLy8gICAgICB7Ci8vICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLyAgICAgIH0KLy8KLy8gIGlmICghQ2hlY2tfRF9GaXJzdFNlY3QoKSkKLy8gICAgICBpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQovLyAgICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAvL2ZvcihpPTA7aTxTRUNUU0laRTtpKyspCi8vICAvLyAgICBTZWN0QnVmW2ldPSpidWYrKzsKLy8KLy8gIC8vaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCi8vICBpZiAoTWVkaWFfRF9Xcml0ZU9uZVNlY3QoZmRvRXh0LCBidWYpKQovLyAgewovLyAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICB9Ci8vCi8vICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKLy8gIHsKLy8gICAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQovLyAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgIHsKLy8gICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICAgICAgfQovLyAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KCi8vLS0tLS0gTWVkaWFfRF9PbmVTZWN0V3JpdGVOZXh0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9PbmVTZWN0V3JpdGVOZXh0KFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZikKewovLyAgaW50IGk7Ci8vICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgaWYgKEluY19EX01lZGlhQWRkcihmZG9FeHQpKQovLyAgICAgIHJldHVybihFcnJDb2RlKTsKLy8KLy8gIGlmICghQ2hlY2tfRF9GaXJzdFNlY3QoKSkKLy8gICAgaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAvL2ZvcihpPTA7aTxTRUNUU0laRTtpKyspCi8vICAvLyAgICBTZWN0QnVmW2ldPSpidWYrKzsKLy8KLy8gIC8vaWYgKE1lZGlhX0RfV3JpdGVPbmVTZWN0KGZkb0V4dCwgU2VjdEJ1ZikpCi8vICBpZiAoTWVkaWFfRF9Xcml0ZU9uZVNlY3QoZmRvRXh0LCBidWYpKQovLyAgewovLyAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vICB9Ci8vCi8vICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKLy8gIHsKLy8gICAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQovLyAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCi8vICAgICAgICAgIHsKLy8gICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKLy8gICAgICAgICAgICAgIHJldHVybihFcnJDb2RlKTsKLy8gICAgICAgICAgfQovLyAgfQoKICAgIHJldHVybihOT19FUlJPUik7Cn0KCi8vLS0tLS0gTWVkaWFfRF9PbmVTZWN0V3JpdGVGbHVzaCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWVkaWFfRF9PbmVTZWN0V3JpdGVGbHVzaChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBpZiAoIUNoZWNrX0RfTGFzdFNlY3QoKSkKICAgICAgICByZXR1cm4oTk9fRVJST1IpOwoKICAgIGlmIChJbmNfRF9NZWRpYUFkZHIoZmRvRXh0KSkKICAgICAgICByZXR1cm4oRXJyQ29kZSk7CgogICAgaWYgKE1lZGlhX0RfQ29weUJsb2NrVGFpbChmZG9FeHQpKQogICAgewogICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICByZXR1cm4oRXJyQ29kZSk7CiAgICB9CgogICAgcmV0dXJuKE5PX0VSUk9SKTsKfQovLwovLy8vTEVEIFRlcm4gT24vT2ZmIFN1YnJvdXRpbmUKLy8vLy0tLS0tIFNNX0VuYWJsZUxFRCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBTTV9FbmFibGVMRUQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQk9PTEVBTiBlbmFibGUpCi8vewovLyAgICBpZiAoZmRvRXh0LT5Ecml2ZV9Jc1NXTEVEKQovLyAgICB7Ci8vICAgICAgICBpZiAoZW5hYmxlKQovLyAgICAgICAgICAgTGVkX0RfVGVybk9uKCk7Ci8vICAgICAgICBlbHNlCi8vICAgICAgICAgICBMZWRfRF9UZXJuT2ZmKCk7Ci8vICAgIH0KLy99Ci8vCi8vLy8tLS0tLSBMZWRfRF9UZXJuT24oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBMZWRfRF9UZXJuT24odm9pZCkKLy97Ci8vICAgIGlmIChDaGVja19EX0NhcmRTdHNDaGcoKSkKLy8gICAgICAgIE1lZGlhQ2hhbmdlPUVSUk9SOwovLwovLyAgICBDbnRfRF9MZWRPbigpOwovL30KLy8KLy8vLy0tLS0tIExlZF9EX1Rlcm5PZmYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIExlZF9EX1Rlcm5PZmYodm9pZCkKLy97Ci8vICAgIGlmIChDaGVja19EX0NhcmRTdHNDaGcoKSkKLy8gICAgICAgIE1lZGlhQ2hhbmdlPUVSUk9SOwovLwovLyAgICBDbnRfRF9MZWRPZmYoKTsKLy99Ci8vCi8vLy9TbWFydE1lZGlhIExvZ2ljYWwgRm9ybWF0IFN1YnJvdXRpbmUKLy8vLy0tLS0tIENoZWNrX0RfTG9nQ0hTKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9Mb2dDSFMoV09SRCAqYyxCWVRFICpoLEJZVEUgKnMpCi8vewovLyAgICBzd2l0Y2goU3NmZGMuTW9kZWwpIHsKLy8gICAgICAgIGNhc2UgU1NGREMxTUI6ICAgKmM9MTI1OyAqaD0gNDsgKnM9IDQ7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzJNQjogICAqYz0xMjU7ICpoPSA0OyAqcz0gODsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDNE1COiAgICpjPTI1MDsgKmg9IDQ7ICpzPSA4OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREM4TUI6ICAgKmM9MjUwOyAqaD0gNDsgKnM9MTY7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzE2TUI6ICAqYz01MDA7ICpoPSA0OyAqcz0xNjsgYnJlYWs7Ci8vICAgICAgICBjYXNlIFNTRkRDMzJNQjogICpjPTUwMDsgKmg9IDg7ICpzPTE2OyBicmVhazsKLy8gICAgICAgIGNhc2UgU1NGREM2NE1COiAgKmM9NTAwOyAqaD0gODsgKnM9MzI7IGJyZWFrOwovLyAgICAgICAgY2FzZSBTU0ZEQzEyOE1COiAqYz01MDA7ICpoPTE2OyAqcz0zMjsgYnJlYWs7Ci8vICAgICAgICBkZWZhdWx0OiAgICAgICAgICpjPSAwOyAgKmg9IDA7ICpzPSAwOyBFcnJDb2RlID0gRVJSX05vU21hcnRNZWRpYTsgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vUG93ZXIgQ29udHJvbGwgJiBNZWRpYSBFeGlzdCBDaGVjayBTdWJyb3V0aW5lCi8vLy8tLS0tLSBJbml0aWFsaXplX0RfTWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBJbml0aWFsaXplX0RfTWVkaWEodm9pZCkKLy97Ci8vICAgIEVyckNvZGUgICAgICA9IE5PX0VSUk9SOwovLyAgICBNZWRpYUNoYW5nZSAgPSBFUlJPUjsKLy8gICAgU2VjdENvcHlNb2RlID0gQ09NUExFVEVEOwovLyAgICBDbnRfRF9SZXNldCgpOwovL30KLy8KLy8vLy0tLS0tIFBvd2VyT2ZmX0RfTWVkaWEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFBvd2VyT2ZmX0RfTWVkaWEodm9pZCkKLy97Ci8vICAgIENudF9EX1Bvd2VyT2ZmKCk7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9NZWRpYVBvd2VyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX01lZGlhUG93ZXIodm9pZCkKLy97Ci8vICAgIC8vdXNsZWVwKDU2KjEwMjQpOwovLyAgICBpZiAoQ2hlY2tfRF9DYXJkU3RzQ2hnKCkpCi8vICAgICAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKCghQ2hlY2tfRF9DbnRQb3dlcigpKSYmKCFNZWRpYUNoYW5nZSkpICAvLyCmsyBwb3dlciAmIE1lZGlhIKhTs1EgY2hhbmdlLCCraCByZXR1cm4gc3VjY2VzcwovLyAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8KLy8gICAgaWYgKENoZWNrX0RfQ2FyZEV4aXN0KCkpICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjYXJkIGlzIG5vdCBleGlzdCwgcmV0dXJuIGVycgovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlICAgICAgICA9IEVSUl9Ob1NtYXJ0TWVkaWE7Ci8vICAgICAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKENudF9EX1Bvd2VyT24oKSkKLy8gICAgewovLyAgICAgICAgRXJyQ29kZSAgICAgICAgPSBFUlJfTm9TbWFydE1lZGlhOwovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgLy91c2xlZXAoNTYqMTAyNCk7Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCi8vLy8tLS0tLUNoZWNrX0RfTWVkaWFFeGlzdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTWVkaWFFeGlzdCh2b2lkKQovL3sKLy8gICAgaWYgKENoZWNrX0RfQ2FyZFN0c0NoZygpKQovLyAgICAgICAgTWVkaWFDaGFuZ2UgPSBFUlJPUjsKLy8KLy8gICAgaWYgKCFDaGVja19EX0NhcmRFeGlzdCgpKQovLyAgICB7Ci8vICAgICAgICBpZiAoIU1lZGlhQ2hhbmdlKQovLyAgICAgICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8KLy8gICAgICAgIEVyckNvZGUgPSBFUlJfQ2hhbmdlZE1lZGlhOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICBFcnJDb2RlID0gRVJSX05vU21hcnRNZWRpYTsKLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBDaGVja19EX01lZGlhV1AoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTWVkaWFXUCh2b2lkKQovL3sKLy8gICAgaWYgKFNzZmRjLkF0dHJpYnV0ZSAmTVdQKQovLyAgICB7Ci8vICAgICAgICBFcnJDb2RlID0gRVJSX1dydFByb3RlY3Q7Ci8vICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICB9Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CiovCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBGb3JtYXQgVGVzdCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9NZWRpYUZtdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9NZWRpYUZtdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCXByaW50aygiQ2hlY2tfRF9NZWRpYUZtdFxuIik7CgkvL1VMT05HIGksaiwgcmVzdWx0PUZBTFNFLCB6b25lLGJsb2NrOwoKCS8vdXNsZWVwKDU2KjEwMjQpOwoJaWYgKCFNZWRpYUNoYW5nZSkKCQlyZXR1cm4oU1VDQ0VTUyk7CgoJTWVkaWFDaGFuZ2UgID0gRVJST1I7CglTZWN0Q29weU1vZGUgPSBDT01QTEVURUQ7CgoJLy91c2xlZXAoNTYqMTAyNCk7CglpZiAoU2V0X0RfUGh5Rm10VmFsdWUodXMpKQoJewoJCUVyckNvZGUgPSBFUlJfVW5rbm93bk1lZGlhOwoJCXJldHVybihFUlJPUik7Cgl9CgkKCS8vdXNsZWVwKDU2KjEwMjQpOwoJaWYgKFNlYXJjaF9EX0NJUyh1cykpCgl7CgkJRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwoJCXJldHVybihFUlJPUik7Cgl9CgoKICAgIE1lZGlhQ2hhbmdlID0gU1VDQ0VTUzsKICAgIHJldHVybihTVUNDRVNTKTsKfQovKgovLy8vLS0tLS0gQ2hlY2tfRF9CbG9ja0lzRnVsbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENoZWNrX0RfQmxvY2tJc0Z1bGwoKQovL3sKLy8gICAgVUxPTkcgaSwgYmxvY2s7Ci8vCi8vICAgIGlmIChJc1hEQ29tcGxpYW5jZSB8fCBJc1NTRkRDQ29tcGxpYW5jZSkKLy8gICAgewovLyAgICAgICAvLyBJZiB0aGUgYmxvY2tzIGFyZSBmdWxsIHRoZW4gcmV0dXJuIHdyaXRlLXByb3RlY3QuCi8vICAgICAgIGJsb2NrID0gU3NmZGMuTWF4QmxvY2tzLzg7Ci8vICAgICAgIGZvciAoTWVkaWEuWm9uZT0wOyBNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzOyBNZWRpYS5ab25lKyspCi8vICAgICAgIHsKLy8gICAgICAgICAgIGlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQovLyAgICAgICAgICAgewovLyAgICAgICAgICAgICAgIGlmIChNYWtlX0RfTG9nVGFibGUoKSkKLy8gICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKLy8gICAgICAgICAgICAgICAgICAgcmV0dXJuOwovLyAgICAgICAgICAgICAgIH0KLy8gICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgIGZvciAoaT0wOyBpPGJsb2NrOyBpKyspCi8vICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgaWYgKEFzc2lnbltNZWRpYS5ab25lXVtpXSAhPSAweEZGKQovLyAgICAgICAgICAgICAgICAgIHJldHVybjsKLy8gICAgICAgICAgIH0KLy8gICAgICAgfQovLyAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgfD0gV1A7Ci8vICAgIH0KLy99Ci8vCi8vCi8vLy8tLS0tLSBDaGVja19EX01lZGlhRm10Rm9yRXJhc2VBbGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfTWVkaWFGbXRGb3JFcmFzZUFsbChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQovL3sKLy8gICAgTWVkaWFDaGFuZ2UgID0gRVJST1I7Ci8vICAgIFNlY3RDb3B5TW9kZSA9IENPTVBMRVRFRDsKLy8KLy8gICAgaWYgKFNldF9EX1BoeUZtdFZhbHVlKGZkb0V4dCkpCi8vICAgIHsKLy8gICAgICAgIEVyckNvZGUgPSBFUlJfVW5rbm93bk1lZGlhOwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICBpZiAoU2VhcmNoX0RfQ0lTKGZkb0V4dCkpCi8vICAgIHsKLy8gICAgICAgIEVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKLy8gICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKFNVQ0NFU1MpOwovL30KKi8KLy9TbWFydE1lZGlhIFBoeXNpY2FsIEFkZHJlc3MgQ29udHJvbGwgU3Vicm91dGluZQovLy0tLS0tIENvbnZfRF9NZWRpYUFkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvbnZfRF9NZWRpYUFkZHIoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBhZGRyKQp7CglEV09SRCB0ZW1wOwoJLy9VTE9ORyAgeno7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCgl0ZW1wICAgICAgICAgICA9IGFkZHIvU3NmZGMuTWF4U2VjdG9yczsKCU1lZGlhLlpvbmUgICAgID0gKEJZVEUpICh0ZW1wL1NzZmRjLk1heExvZ0Jsb2Nrcyk7CgoJaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCgl7CgkJaWYgKE1ha2VfRF9Mb2dUYWJsZSh1cykpCgkJewoJCQlFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7CgkJCXJldHVybihFUlJPUik7CgkJfQoJfQoKCU1lZGlhLlNlY3RvciAgID0gKEJZVEUpIChhZGRyJVNzZmRjLk1heFNlY3RvcnMpOwoJTWVkaWEuTG9nQmxvY2sgPSAoV09SRCkgKHRlbXAlU3NmZGMuTWF4TG9nQmxvY2tzKTsKCglpZiAoTWVkaWEuWm9uZTxTc2ZkYy5NYXhab25lcykKCXsKCQlDbHJfRF9SZWR1bmRhbnREYXRhKFJlZHVuZGFudCk7CgkJU2V0X0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCk7CgkJTWVkaWEuUGh5QmxvY2sgPSBMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXTsKCQlyZXR1cm4oU1VDQ0VTUyk7Cgl9CgoJRXJyQ29kZSA9IEVSUl9PdXRPZkxCQTsKCXJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gSW5jX0RfTWVkaWFBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgSW5jX0RfTWVkaWFBZGRyKHN0cnVjdCB1c19kYXRhICp1cykKewoJV09SRCAgICAgICAgTG9nQmxvY2sgPSBNZWRpYS5Mb2dCbG9jazsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCWlmICgrK01lZGlhLlNlY3RvcjxTc2ZkYy5NYXhTZWN0b3JzKQoJCXJldHVybihTVUNDRVNTKTsKCglpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCXsKCQlpZiAoTWFrZV9EX0xvZ1RhYmxlKHVzKSkKCQl7CgkJCUVyckNvZGUgPSBFUlJfSWxsZWdhbEZtdDsKCQkJcmV0dXJuKEVSUk9SKTsKCQl9Cgl9CgoJTWVkaWEuU2VjdG9yPTA7CglNZWRpYS5Mb2dCbG9jayA9IExvZ0Jsb2NrOwoKCWlmICgrK01lZGlhLkxvZ0Jsb2NrPFNzZmRjLk1heExvZ0Jsb2NrcykKCXsKCQlDbHJfRF9SZWR1bmRhbnREYXRhKFJlZHVuZGFudCk7CgkJU2V0X0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCk7CgkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja107CgkJcmV0dXJuKFNVQ0NFU1MpOwoJfQoKCU1lZGlhLkxvZ0Jsb2NrPTA7CgoJaWYgKCsrTWVkaWEuWm9uZTxTc2ZkYy5NYXhab25lcykKCXsKCQlpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCQl7CgkJCWlmIChNYWtlX0RfTG9nVGFibGUodXMpKQoJCQl7CgkJCQlFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7CgkJCQlyZXR1cm4oRVJST1IpOwoJCQl9CgkJfQoKCQlNZWRpYS5Mb2dCbG9jayA9IDA7CgoJCUNscl9EX1JlZHVuZGFudERhdGEoUmVkdW5kYW50KTsKCQlTZXRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KTsKCQlNZWRpYS5QaHlCbG9jaz1Mb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXTsKCQlyZXR1cm4oU1VDQ0VTUyk7Cgl9CgoJTWVkaWEuWm9uZT0wOwoJRXJyQ29kZSA9IEVSUl9PdXRPZkxCQTsKCglyZXR1cm4oRVJST1IpOwp9Ci8qCi8vLS0tLS0gQ2hlY2tfRF9GaXJzdFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9GaXJzdFNlY3Qodm9pZCkKewogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICBpZiAoIU1lZGlhLlNlY3RvcikKICAgICAgICByZXR1cm4oU1VDQ0VTUyk7CgogICAgcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBDaGVja19EX0xhc3RTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDaGVja19EX0xhc3RTZWN0KHZvaWQpCnsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgaWYgKE1lZGlhLlNlY3RvcjwoU3NmZGMuTWF4U2VjdG9ycy0xKSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIHJldHVybihTVUNDRVNTKTsKfQoqLwovL1NtYXJ0TWVkaWEgUmVhZC9Xcml0ZSBTdWJyb3V0aW5lIHdpdGggUmV0cnkKLy8tLS0tLSBNZWRpYV9EX1JlYWRPbmVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1JlYWRPbmVTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmKQp7CglEV09SRCBlcnIsIHJldHJ5OwoKCWlmICghUmVhZF9EX1BoeU9uZVNlY3QodXMsIGNvdW50LCBidWYpKQoJCXJldHVybihTVUNDRVNTKTsKCWlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKCQlyZXR1cm4oRVJST1IpOwoJaWYgKEVyckNvZGU9PUVSUl9EYXRhU3RhdHVzKQoJCXJldHVybihFUlJPUik7CgojaWZkZWYgUkRFUlJfUkVBU1NJR04KCWlmIChTc2ZkYy5BdHRyaWJ1dGUgJk1XUCkKCXsKCQlpZiAoRXJyQ29kZT09RVJSX0NvclJlYWRFcnIpCgkJCXJldHVybihTVUNDRVNTKTsKCQlyZXR1cm4oRVJST1IpOwoJfQoKCWVycj1FcnJDb2RlOwoJZm9yKHJldHJ5PTA7IHJldHJ5PDI7IHJldHJ5KyspCgl7CgkJaWYgKENvcHlfRF9CbG9ja0FsbCh1cywgKGVycj09RVJSX0VjY1JlYWRFcnIpP1JFUV9GQUlMOlJFUV9FUkFTRSkpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJCQlyZXR1cm4oRVJST1IpOwoJCQljb250aW51ZTsKCQl9CgoJCUVyckNvZGUgPSBlcnI7CgkJaWYgKEVyckNvZGU9PUVSUl9Db3JSZWFkRXJyKQoJCQlyZXR1cm4oU1VDQ0VTUyk7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCglNZWRpYUNoYW5nZSA9IEVSUk9SOwojZWxzZQoJaWYgKEVyckNvZGU9PUVSUl9Db3JSZWFkRXJyKSByZXR1cm4oU1VDQ0VTUyk7CiNlbmRpZgoKCXJldHVybihFUlJPUik7Cn0KLyoKLy8tLS0tLSBNZWRpYV9EX1dyaXRlT25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX1dyaXRlT25lU2VjdChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBXT1JEIGNvdW50LCBCWVRFICpidWYpCnsKICAgIERXT1JEIHJldHJ5OwogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICBpZiAoIVdyaXRlX0RfUGh5T25lU2VjdChmZG9FeHQsIGNvdW50LCBidWYpKQogICAgICAgIHJldHVybihTVUNDRVNTKTsKICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIGZvcihyZXRyeT0xOyByZXRyeTwyOyByZXRyeSsrKQogICAgewogICAgICAgIGlmIChSZWFzc2lnbl9EX0Jsb2NrSGVhZChmZG9FeHQpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIVdyaXRlX0RfUGh5T25lU2VjdChmZG9FeHQsIGNvdW50LCBidWYpKQogICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7CiAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgfQoKICAgIGlmIChSZWxlYXNlX0RfV3JpdGVCbG9jayhmZG9FeHQpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgRXJyQ29kZSAgICAgICAgPSBFUlJfV3JpdGVGYXVsdDsKICAgIE1lZGlhQ2hhbmdlID0gRVJST1I7CiAgICByZXR1cm4oRVJST1IpOwp9CgovL1NtYXJ0TWVkaWEgRGF0YSBDb3B5IFN1YnJvdXRpbmUgd2l0aCBSZXRyeQovLy0tLS0tIE1lZGlhX0RfQ29weUJsb2NrSGVhZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1lZGlhX0RfQ29weUJsb2NrSGVhZChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0KQp7CiAgICBEV09SRCByZXRyeTsKCiAgICBmb3IocmV0cnk9MDsgcmV0cnk8MjsgcmV0cnkrKykKICAgIHsKICAgICAgICBpZiAoIUNvcHlfRF9CbG9ja0hlYWQoZmRvRXh0KSkKICAgICAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgIH0KCiAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwogICAgcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBNZWRpYV9EX0NvcHlCbG9ja1RhaWwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBNZWRpYV9EX0NvcHlCbG9ja1RhaWwoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgRFdPUkQgcmV0cnk7CgogICAgaWYgKCFDb3B5X0RfQmxvY2tUYWlsKGZkb0V4dCkpCiAgICAgICAgcmV0dXJuKFNVQ0NFU1MpOwogICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgZm9yKHJldHJ5PTE7IHJldHJ5PDI7IHJldHJ5KyspCiAgICB7CiAgICAgICAgaWYgKFJlYXNzaWduX0RfQmxvY2tIZWFkKGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICghQ29weV9EX0Jsb2NrVGFpbChmZG9FeHQpKQogICAgICAgICAgICByZXR1cm4oU1VDQ0VTUyk7CiAgICAgICAgaWYgKEVyckNvZGU9PUVSUl9Id0Vycm9yKQogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgfQoKICAgIGlmIChSZWxlYXNlX0RfV3JpdGVCbG9jayhmZG9FeHQpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgRXJyQ29kZSAgICAgICAgPSBFUlJfV3JpdGVGYXVsdDsKICAgIE1lZGlhQ2hhbmdlID0gRVJST1I7CiAgICByZXR1cm4oRVJST1IpOwp9Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlT25lQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VPbmVCbG9jayh2b2lkKQovL3sKLy8gICAgV09SRCAgICAgICAgTG9nQmxvY2sgPSBNZWRpYS5Mb2dCbG9jazsKLy8gICAgV09SRCAgICAgICAgUGh5QmxvY2sgPSBNZWRpYS5QaHlCbG9jazsKLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBpZiAoTWVkaWEuUGh5QmxvY2s9PU5PX0FTU0lHTikKLy8gICAgICAgIHJldHVybihTVUNDRVNTKTsKLy8KLy8gICAgaWYgKExvZzJQaHlbTWVkaWEuWm9uZV09PU5VTEwpCi8vICAgIHsKLy8gICAgICAgIGlmIChNYWtlX0RfTG9nVGFibGUoKSkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBFcnJDb2RlID0gRVJSX0lsbGVnYWxGbXQ7Ci8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIH0KLy8gICAgfQovLyAgICBNZWRpYS5Mb2dCbG9jayA9IExvZ0Jsb2NrOwovLyAgICBNZWRpYS5QaHlCbG9jayA9IFBoeUJsb2NrOwovLwovLyAgICBMb2cyUGh5W01lZGlhLlpvbmVdW01lZGlhLkxvZ0Jsb2NrXT1OT19BU1NJR047Ci8vCi8vICAgIGlmIChFcmFzZV9EX1BoeU9uZUJsb2NrKGZkb0V4dCkpCi8vICAgIHsKLy8gICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICAgaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2soKSkKLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLwovLyAgICAgICAgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OwovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgfQovLwovLyAgICBDbHJfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKLy8gICAgTWVkaWEuUGh5QmxvY2s9Tk9fQVNTSUdOOwovLyAgICByZXR1cm4oU1VDQ0VTUyk7Ci8vfQovLwovLy8vU21hcnRNZWRpYSBFcmFzZSBTdWJyb3V0aW5lCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQWxsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IE1lZGlhX0RfRXJhc2VBbGxCbG9jayh2b2lkKQovL3sKLy8gICAgV09SRCBjaXM9MDsKLy8KLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci8vICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwovLwovLyAgICBNZWRpYUNoYW5nZSA9IEVSUk9SOwovLyAgICBNZWRpYS5TZWN0b3IgICA9IDA7Ci8vCi8vICAgIGZvcihNZWRpYS5ab25lPTA7IE1lZGlhLlpvbmU8U3NmZGMuTWF4Wm9uZXM7IE1lZGlhLlpvbmUrKykKLy8gICAgICAgIGZvcihNZWRpYS5QaHlCbG9jaz0wOyBNZWRpYS5QaHlCbG9jazxTc2ZkYy5NYXhCbG9ja3M7IE1lZGlhLlBoeUJsb2NrKyspIHsKLy8gICAgICAgICAgICBpZiAoU3NmZGNfRF9SZWFkUmVkdERhdGEoUmVkdW5kYW50KSkKLy8gICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgU3NmZGNfRF9SZXNldChmZG9FeHQpOwovLyAgICAgICAgICAgIGlmICghQ2hlY2tfRF9GYWlsQmxvY2soUmVkdW5kYW50KSkKLy8gICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgIGlmIChjaXMpCi8vICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgIGlmIChTc2ZkY19EX0VyYXNlQmxvY2soZmRvRXh0KSkKLy8gICAgICAgICAgICAgICAgICAgIHsKLy8gICAgICAgICAgICAgICAgICAgICAgICBFcnJDb2RlID0gRVJSX0h3RXJyb3I7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICAgICAgICAgIGlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCi8vICAgICAgICAgICAgICAgICAgICB7Ci8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2soKSkKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICAgICAgICAgIH0KLy8KLy8gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwovLyAgICAgICAgICAgICAgICB9Ci8vCi8vICAgICAgICAgICAgICAgIGlmIChNZWRpYS5QaHlCbG9jayE9Q2lzQXJlYS5QaHlCbG9jaykKLy8gICAgICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICAgICAgRXJyQ29kZSA9IEVSUl9JbGxlZ2FsRm10OwovLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgICAgICAgICAgfQovLwovLyAgICAgICAgICAgICAgICBjaXMrKzsKLy8gICAgICAgICAgICB9Ci8vCi8vICAgICAgICB9Ci8vICAgIHJldHVybihTVUNDRVNTKTsKLy99CiovCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBTZWN0b3IgRGF0YSBDb3B5IFN1YnJvdXRpbmUKLy8tLS0tLSBDb3B5X0RfQmxvY2tBbGwoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb3B5X0RfQmxvY2tBbGwoc3RydWN0IHVzX2RhdGEgKnVzLCBEV09SRCBtb2RlKQp7CglCWVRFIHNlY3Q7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglzZWN0PU1lZGlhLlNlY3RvcjsKCglpZiAoQXNzaWduX0RfV3JpdGVCbG9jaygpKQoJCXJldHVybihFUlJPUik7CglpZiAobW9kZT09UkVRX0ZBSUwpCgkJU2VjdENvcHlNb2RlPVJFUV9GQUlMOwoKCWZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnM7IE1lZGlhLlNlY3RvcisrKQoJewoJCWlmIChDb3B5X0RfUGh5T25lU2VjdCh1cykpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCgkJCQlyZXR1cm4oRVJST1IpOwoJCQlpZiAoUmVsZWFzZV9EX1dyaXRlQmxvY2sodXMpKQoJCQkJcmV0dXJuKEVSUk9SKTsKCgkJCUVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKCQkJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoJCQlNZWRpYS5TZWN0b3I9c2VjdDsKCgkJCXJldHVybihFUlJPUik7CgkJfQoJfQoKCWlmIChSZWxlYXNlX0RfUmVhZEJsb2NrKHVzKSkKCQlyZXR1cm4oRVJST1IpOwoKCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CglNZWRpYS5TZWN0b3I9c2VjdDsKCXJldHVybihTVUNDRVNTKTsKfQovKgovLy0tLS0tIENvcHlfRF9CbG9ja0hlYWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENvcHlfRF9CbG9ja0hlYWQoUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCkKewogICAgQllURSBzZWN0OwogICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CiAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCiAgICBzZWN0PU1lZGlhLlNlY3RvcjsKICAgIGlmIChBc3NpZ25fRF9Xcml0ZUJsb2NrKCkpCiAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICBmb3IoTWVkaWEuU2VjdG9yPTA7IE1lZGlhLlNlY3RvcjxzZWN0OyBNZWRpYS5TZWN0b3IrKykKICAgIHsKICAgICAgICBpZiAoQ29weV9EX1BoeU9uZVNlY3QoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgICAgIGlmIChSZWxlYXNlX0RfV3JpdGVCbG9jayhmZG9FeHQpKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICAgICAgTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwogICAgICAgICAgICBNZWRpYS5TZWN0b3I9c2VjdDsKCiAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgfQogICAgfQoKICAgIE1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CiAgICBNZWRpYS5TZWN0b3I9c2VjdDsKICAgIHJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBDb3B5X0RfQmxvY2tUYWlsKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBDb3B5X0RfQmxvY2tUYWlsKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIEJZVEUgc2VjdDsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgZm9yKHNlY3Q9TWVkaWEuU2VjdG9yOyBNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9yczsgTWVkaWEuU2VjdG9yKyspCiAgICB7CiAgICAgICAgaWYgKENvcHlfRF9QaHlPbmVTZWN0KGZkb0V4dCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpCiAgICAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgICAgICAgICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKICAgICAgICAgICAgTWVkaWEuU2VjdG9yPXNlY3Q7CgogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoUmVsZWFzZV9EX1JlYWRCbG9jayhmZG9FeHQpKQogICAgICAgIHJldHVybihFUlJPUik7CgogICAgTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIFJlYXNzaWduX0RfQmxvY2tIZWFkKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlYXNzaWduX0RfQmxvY2tIZWFkKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQpCnsKICAgIERXT1JEICBtb2RlOwogICAgV09SRCAgIGJsb2NrOwogICAgQllURSAgIHNlY3Q7CiAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKICAgIEFERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKICAgIG1vZGU9U2VjdENvcHlNb2RlOwogICAgYmxvY2s9UmVhZEJsb2NrOwogICAgc2VjdD1NZWRpYS5TZWN0b3I7CgogICAgaWYgKEFzc2lnbl9EX1dyaXRlQmxvY2soKSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIFNlY3RDb3B5TW9kZT1SRVFfRkFJTDsKCiAgICBmb3IoTWVkaWEuU2VjdG9yPTA7IE1lZGlhLlNlY3RvcjxzZWN0OyBNZWRpYS5TZWN0b3IrKykKICAgIHsKICAgICAgICBpZiAoQ29weV9EX1BoeU9uZVNlY3QoZmRvRXh0KSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChFcnJDb2RlPT1FUlJfSHdFcnJvcikKICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7CiAgICAgICAgICAgIGlmIChSZWxlYXNlX0RfV3JpdGVCbG9jayhmZG9FeHQpKQogICAgICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKCiAgICAgICAgICAgIEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKICAgICAgICAgICAgU2VjdENvcHlNb2RlPW1vZGU7CiAgICAgICAgICAgIFdyaXRlQmxvY2s9UmVhZEJsb2NrOwogICAgICAgICAgICBSZWFkQmxvY2s9YmxvY2s7CiAgICAgICAgICAgIE1lZGlhLlNlY3Rvcj1zZWN0OwogICAgICAgICAgICBNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwoKICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKFJlbGVhc2VfRF9SZWFkQmxvY2soZmRvRXh0KSkKICAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIFNlY3RDb3B5TW9kZT1tb2RlOwogICAgUmVhZEJsb2NrPWJsb2NrOwogICAgTWVkaWEuU2VjdG9yPXNlY3Q7CiAgICBNZWRpYS5QaHlCbG9jaz1Xcml0ZUJsb2NrOwogICAgcmV0dXJuKFNVQ0NFU1MpOwp9CiovCi8vU21hcnRNZWRpYSBQaHlzaWNhbCBCbG9jayBBc3NpZ24vUmVsZWFzZSBTdWJyb3V0aW5lCi8vLS0tLS0gQXNzaWduX0RfV3JpdGVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQXNzaWduX0RfV3JpdGVCbG9jayh2b2lkKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCVJlYWRCbG9jaz1NZWRpYS5QaHlCbG9jazsKCglmb3IoV3JpdGVCbG9jaz1Bc3NpZ25TdGFydFtNZWRpYS5ab25lXTsgV3JpdGVCbG9jazxTc2ZkYy5NYXhCbG9ja3M7IFdyaXRlQmxvY2srKykKCXsKCQlpZiAoIUNoa19EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sV3JpdGVCbG9jaykpCgkJewoJCQlTZXRfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLFdyaXRlQmxvY2spOwoJCQlBc3NpZ25TdGFydFtNZWRpYS5ab25lXT1Xcml0ZUJsb2NrKzE7CgkJCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgkJCVNlY3RDb3B5TW9kZT1SRVFfRVJBU0U7CgkJCS8vRXJyWERDb2RlID0gTk9fRVJST1I7CgkJCXJldHVybihTVUNDRVNTKTsKCQl9Cgl9CgoJZm9yKFdyaXRlQmxvY2s9MDsgV3JpdGVCbG9jazxBc3NpZ25TdGFydFtNZWRpYS5ab25lXTsgV3JpdGVCbG9jaysrKQoJewoJCWlmICghQ2hrX0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxXcml0ZUJsb2NrKSkKCQl7CgkJCVNldF9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sV3JpdGVCbG9jayk7CgkJCUFzc2lnblN0YXJ0W01lZGlhLlpvbmVdPVdyaXRlQmxvY2srMTsKCQkJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCQkJU2VjdENvcHlNb2RlPVJFUV9FUkFTRTsKCQkJLy9FcnJYRENvZGUgPSBOT19FUlJPUjsKCQkJcmV0dXJuKFNVQ0NFU1MpOwoJCX0KCX0KCglXcml0ZUJsb2NrPU5PX0FTU0lHTjsKCUVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsKCS8vIEZvciB4RCB0ZXN0CgkvL1NzZmRjLkF0dHJpYnV0ZSB8PSBXUDsKCS8vRXJyWERDb2RlID0gRVJSX1dydFByb3RlY3Q7CglyZXR1cm4oRVJST1IpOwp9CgovLy0tLS0tIFJlbGVhc2VfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFJlbGVhc2VfRF9SZWFkQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQp7CglEV09SRCBtb2RlOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJbW9kZT1TZWN0Q29weU1vZGU7CglTZWN0Q29weU1vZGU9Q09NUExFVEVEOwoKCWlmIChtb2RlPT1DT01QTEVURUQpCgkJcmV0dXJuKFNVQ0NFU1MpOwoKCUxvZzJQaHlbTWVkaWEuWm9uZV1bTWVkaWEuTG9nQmxvY2tdPVdyaXRlQmxvY2s7CglNZWRpYS5QaHlCbG9jaz1SZWFkQmxvY2s7CgoJaWYgKE1lZGlhLlBoeUJsb2NrPT1OT19BU1NJR04pCgl7CgkJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCQlyZXR1cm4oU1VDQ0VTUyk7Cgl9CgoJaWYgKG1vZGU9PVJFUV9FUkFTRSkKCXsKCQlpZiAoRXJhc2VfRF9QaHlPbmVCbG9jayh1cykpCgkJewoJCQlpZiAoRXJyQ29kZT09RVJSX0h3RXJyb3IpIHJldHVybihFUlJPUik7CgkJCWlmIChNYXJrRmFpbF9EX1BoeU9uZUJsb2NrKHVzKSkgcmV0dXJuKEVSUk9SKTsKCQl9CgkJZWxzZQoJCQlDbHJfRF9CaXQoQXNzaWduW01lZGlhLlpvbmVdLE1lZGlhLlBoeUJsb2NrKTsKCX0KCWVsc2UgaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2sodXMpKQoJCXJldHVybihFUlJPUik7CgoJTWVkaWEuUGh5QmxvY2s9V3JpdGVCbG9jazsKCXJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBSZWxlYXNlX0RfV3JpdGVCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBSZWxlYXNlX0RfV3JpdGVCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoJU2VjdENvcHlNb2RlPUNPTVBMRVRFRDsKCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgoJaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2sodXMpKQoJCXJldHVybihFUlJPUik7CgoJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgU2VjdG9yIERhdGEgQ29weSBTdWJyb3V0aW5lCi8vLS0tLS0gQ29weV9EX1BoeU9uZVNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ29weV9EX1BoeU9uZVNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzKQp7CglpbnQgICAgICAgICAgIGk7CglEV09SRCAgZXJyLCByZXRyeTsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCS8vcHJpbnRrKCJDb3B5X0RfUGh5T25lU2VjdCAtLS0gU2Vjb3RyID0gJXhcbiIsIE1lZGlhLlNlY3Rvcik7CglpZiAoUmVhZEJsb2NrIT1OT19BU1NJR04pCgl7CgkJTWVkaWEuUGh5QmxvY2s9UmVhZEJsb2NrOwoJCWZvcihyZXRyeT0wOyByZXRyeTwyOyByZXRyeSsrKQoJCXsKCQkJaWYgKHJldHJ5IT0wKQoJCQl7CgkJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJCWlmIChTc2ZkY19EX1JlYWRDaXNTZWN0KHVzLFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCgkJCQlpZiAoQ2hlY2tfRF9DSVNkYXRhKFdvcmtCdWYsV29ya1JlZHVuZCkpCgkJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCQkJfQoKCQkJaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsV29ya0J1ZixXb3JrUmVkdW5kKSkKCQkJeyBFcnJDb2RlID0gRVJSX0h3RXJyb3I7IE1lZGlhQ2hhbmdlPUVSUk9SOyByZXR1cm4oRVJST1IpOyB9CgkJCWlmIChDaGVja19EX0RhdGFTdGF0dXMoV29ya1JlZHVuZCkpCgkJCXsgZXJyPUVSUk9SOyBicmVhazsgfQoJCQlpZiAoIUNoZWNrX0RfUmVhZEVycm9yKFdvcmtSZWR1bmQpKQoJCQl7IGVycj1TVUNDRVNTOyBicmVhazsgfQoJCQlpZiAoIUNoZWNrX0RfQ29ycmVjdChXb3JrQnVmLFdvcmtSZWR1bmQpKQoJCQl7IGVycj1TVUNDRVNTOyBicmVhazsgfQoKCQkJZXJyPUVSUk9SOwoJCQlTZWN0Q29weU1vZGU9UkVRX0ZBSUw7CgkJfQoJfQoJZWxzZQoJewoJCWVycj1TVUNDRVNTOwoJCWZvcihpPTA7IGk8U0VDVFNJWkU7IGkrKykKCQkJV29ya0J1ZltpXT1EVU1NWV9EQVRBOwoJCUNscl9EX1JlZHVuZGFudERhdGEoV29ya1JlZHVuZCk7Cgl9CgoJU2V0X0RfTG9nQmxvY2tBZGRyKFdvcmtSZWR1bmQpOwoJaWYgKGVycj09RVJST1IpCgl7CgkJU2V0X0RfUmlnaHRFQ0MoV29ya1JlZHVuZCk7CgkJU2V0X0RfRGF0YVN0YXVzKFdvcmtSZWR1bmQpOwoJfQoKCU1lZGlhLlBoeUJsb2NrPVdyaXRlQmxvY2s7CgoJaWYgKFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weSh1cywgV29ya0J1ZiwgV29ya1JlZHVuZCkpCgl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCWlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCgl7IEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsgcmV0dXJuKEVSUk9SKTsgfQoKCU1lZGlhLlBoeUJsb2NrPVJlYWRCbG9jazsKCXJldHVybihTVUNDRVNTKTsKfQoKLy9TbWFydE1lZGlhIFBoeXNpY2FsIFNlY3RvciBSZWFkL1dyaXRlL0VyYXNlIFN1YnJvdXRpbmUKLy8tLS0tLSBSZWFkX0RfUGh5T25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBSZWFkX0RfUGh5T25lU2VjdChzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZikKewoJaW50ICAgICAgICAgICBpOwoJRFdPUkQgIHJldHJ5OwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJaWYgKE1lZGlhLlBoeUJsb2NrPT1OT19BU1NJR04pCgl7CgkJZm9yKGk9MDsgaTxTRUNUU0laRTsgaSsrKQoJCQkqYnVmKys9RFVNTVlfREFUQTsKCQlyZXR1cm4oU1VDQ0VTUyk7Cgl9CgoJZm9yKHJldHJ5PTA7IHJldHJ5PDI7IHJldHJ5KyspCgl7CgkJaWYgKHJldHJ5IT0wKQoJCXsKCQkJU3NmZGNfRF9SZXNldCh1cyk7CgoJCQlpZiAoU3NmZGNfRF9SZWFkQ2lzU2VjdCh1cyxXb3JrQnVmLFdvcmtSZWR1bmQpKQoJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCQkJaWYgKENoZWNrX0RfQ0lTZGF0YShXb3JrQnVmLFdvcmtSZWR1bmQpKQoJCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCQl9CgoJCS8vaWYgKFNzZmRjX0RfUmVhZFNlY3QoZmRvRXh0LGJ1ZixSZWR1bmRhbnQpKQoJCWlmIChTc2ZkY19EX1JlYWRCbG9jayh1cyxjb3VudCxidWYsUmVkdW5kYW50KSkKCQl7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KCQlpZiAoQ2hlY2tfRF9EYXRhU3RhdHVzKFJlZHVuZGFudCkpCgkJeyBFcnJDb2RlID0gRVJSX0RhdGFTdGF0dXM7IHJldHVybihFUlJPUik7IH0KCgkJaWYgKCFDaGVja19EX1JlYWRFcnJvcihSZWR1bmRhbnQpKQoJCQlyZXR1cm4oU1VDQ0VTUyk7CgoJCWlmICghQ2hlY2tfRF9Db3JyZWN0KGJ1ZixSZWR1bmRhbnQpKQoJCXsgRXJyQ29kZSA9IEVSUl9Db3JSZWFkRXJyOyByZXR1cm4oRVJST1IpOyB9Cgl9CgoJRXJyQ29kZSA9IEVSUl9FY2NSZWFkRXJyOwoJcmV0dXJuKEVSUk9SKTsKfQovKgovLy0tLS0tIFdyaXRlX0RfUGh5T25lU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFdyaXRlX0RfUGh5T25lU2VjdChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBXT1JEIGNvdW50LCBCWVRFICpidWYpCnsKICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwogICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgogICAgLy9pZiAoU3NmZGNfRF9Xcml0ZVNlY3QoZmRvRXh0LGJ1ZixSZWR1bmRhbnQpKQogICAgaWYgKFNzZmRjX0RfV3JpdGVCbG9jayhmZG9FeHQsY291bnQsYnVmLFJlZHVuZGFudCkpCiAgICB7IEVyckNvZGUgPSBFUlJfSHdFcnJvcjsgTWVkaWFDaGFuZ2U9RVJST1I7IHJldHVybihFUlJPUik7IH0KICAgIGlmIChTc2ZkY19EX0NoZWNrU3RhdHVzKCkpCiAgICB7IEVyckNvZGUgPSBFUlJfV3JpdGVGYXVsdDsgcmV0dXJuKEVSUk9SKTsgfQoKICAgIHJldHVybihTVUNDRVNTKTsKfQoqLwovLy0tLS0tIEVyYXNlX0RfUGh5T25lQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IEVyYXNlX0RfUGh5T25lQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglpZiAoU3NmZGNfRF9FcmFzZUJsb2NrKHVzKSkKCXsgRXJyQ29kZSA9IEVSUl9Id0Vycm9yOyBNZWRpYUNoYW5nZT1FUlJPUjsgcmV0dXJuKEVSUk9SKTsgfQoJaWYgKFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSkKCXsgRXJyQ29kZSA9IEVSUl9Xcml0ZUZhdWx0OyByZXR1cm4oRVJST1IpOyB9CgoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovL1NtYXJ0TWVkaWEgUGh5c2ljYWwgRm9ybWF0IENoZWNrIExvY2FsIFN1YnJvdXRpbmUKLy8tLS0tLSBTZXRfRF9QaHlGbXRWYWx1ZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTZXRfRF9QaHlGbXRWYWx1ZShzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKLy8gICAgUFBET19ERVZJQ0VfRVhURU5TSU9OICAgcGRvRXh0OwovLyAgICBCWVRFICAgICAgaWRjb2RlWzRdOwovLyAgICBEV09SRCAgICAgVXNlckRlZkRhdGFfMSwgVXNlckRlZkRhdGFfMiwgRGF0YSwgbWFzazsKLy8KLy8gICAgLy9pZiAoIWZkb0V4dC0+Q2hpbGREZXZpY2VPYmplY3QpICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIC8vcGRvRXh0ID0gZmRvRXh0LT5DaGlsZERldmljZU9iamVjdC0+RGV2aWNlRXh0ZW5zaW9uOwovLwovLyAgICBTc2ZkY19EX1JlYWRJRChpZGNvZGUsIFJFQURfSURfMSk7Ci8vCiAgICAvL2lmIChTZXRfRF9Tc2ZkY01vZGVsKGlkY29kZVsxXSkpCiAgICBpZiAoU2V0X0RfU3NmZGNNb2RlbCh1cy0+U01fRGV2aWNlSUQpKQogICAgICAgIHJldHVybihFUlJPUik7CgovLyAgICAvL1VzZSBNdWx0aS1mdW5jdGlvbiBwaW4gdG8gZGlmZmVyZW50aWF0ZSBTTSBhbmQgeEQuCi8vICAgIFVzZXJEZWZEYXRhXzEgPSBSZWFkUENJUmVnKGZkb0V4dC0+QnVzSUQsIGZkb0V4dC0+RGV2SUQsIGZkb0V4dC0+RnVuY0lELCBQQ0lfUkVHX1VTRVJfREVGKSAmIDB4ODA7Ci8vICAgIGlmIChVc2VyRGVmRGF0YV8xKQovLyAgICB7Ci8vICAgICAgIGlmICggUkVBRF9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMpICYgMHg4MCApICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1hEOwovLyAgICAgICBpZiAoIFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4NDAgKSAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9TTTsKLy8KLy8gICAgICAgaWYgKCBJc1hEQ29tcGxpYW5jZSAmJiAoZmRvRXh0LT5EaXNrVHlwZSA9PSBESVNLVFlQRV9YRCkgKQovLyAgICAgICB7Ci8vICAgICAgICAgIFNzZmRjX0RfUmVhZElEKGlkY29kZSwgUkVBRF9JRF8zKTsKLy8gICAgICAgICAgaWYgKGlkY29kZVsyXSAhPSAweEI1KQovLyAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICB9Ci8vICAgIH0KLy8KLy8gICAgLy9Vc2UgR1BJTyB0byBkaWZmZXJlbnRpYXRlIFNNIGFuZCB4RC4KLy8gICAgVXNlckRlZkRhdGFfMiA9IFJlYWRQQ0lSZWcoZmRvRXh0LT5CdXNJRCwgZmRvRXh0LT5EZXZJRCwgZmRvRXh0LT5GdW5jSUQsIFBDSV9SRUdfVVNFUl9ERUYpID4+IDg7Ci8vICAgIGlmICggVXNlckRlZkRhdGFfMiApCi8vICAgIHsKLy8gICAgICAgRGF0YSA9IFJlYWRQQ0lSZWcoZmRvRXh0LT5CdXNJRCwgZmRvRXh0LT5EZXZJRCwgMCwgMHhBQyk7Ci8vCi8vICAgICAgIG1hc2sgPSAxIDw8IChVc2VyRGVmRGF0YV8yLTEpOwovLyAgICAgICAvLyAxIDogeEQgLCAwIDogU00KLy8gICAgICAgaWYgKCBEYXRhICYgbWFzaykKLy8gICAgICAgICAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1hEOwovLyAgICAgICBlbHNlCi8vICAgICAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9TTTsKLy8KLy8gICAgICAgaWYgKCBJc1hEQ29tcGxpYW5jZSAmJiAoZmRvRXh0LT5EaXNrVHlwZSA9PSBESVNLVFlQRV9YRCkgKQovLyAgICAgICB7Ci8vICAgICAgICAgIFNzZmRjX0RfUmVhZElEKGlkY29kZSwgUkVBRF9JRF8zKTsKLy8gICAgICAgICAgaWYgKGlkY29kZVsyXSAhPSAweEI1KQovLyAgICAgICAgICAgICByZXR1cm4oRVJST1IpOwovLyAgICAgICB9Ci8vICAgIH0KLy8KLy8gICAgaWYgKCAhKFVzZXJEZWZEYXRhXzEgfCBVc2VyRGVmRGF0YV8yKSApCi8vICAgIHsKLy8gICAgICAvLyBVc2UgVXNlckRlZmluZSBSZWdpc3RlciB0byBkaWZmZXJlbnRpYXRlIFNNIGFuZCB4RC4KLy8gICAgICBTc2ZkY19EX1JlYWRJRChpZGNvZGUsIFJFQURfSURfMyk7Ci8vCi8vICAgICAgaWYgKGlkY29kZVsyXSA9PSAweEI1KQovLyAgICAgICAgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9YRDsKLy8gICAgICBlbHNlCi8vICAgICAgewovLyAgICAgICAgICBpZiAoIUlzWERDb21wbGlhbmNlKQovLyAgICAgICAgICAgICBmZG9FeHQtPkRpc2tUeXBlID0gRElTS1RZUEVfU007Ci8vICAgICAgICAgIGVsc2UKLy8gICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICB9Ci8vCi8vICAgICAgaWYgKGZkb0V4dC0+VXNlckRlZl9EaXNrVHlwZSA9PSAweDA0KSAgZmRvRXh0LT5EaXNrVHlwZSA9IERJU0tUWVBFX1hEOwovLyAgICAgIGlmIChmZG9FeHQtPlVzZXJEZWZfRGlza1R5cGUgPT0gMHgwOCkgIGZkb0V4dC0+RGlza1R5cGUgPSBESVNLVFlQRV9TTTsKLy8gICAgfQovLwovLyAgICBpZiAoIWZkb0V4dC0+VXNlckRlZl9EaXNhYmxlV1ApCi8vICAgIHsKLy8gICAgICAgaWYgKGZkb0V4dC0+RGlza1R5cGUgPT0gRElTS1RZUEVfU00pCi8vICAgICAgIHsKLy8gICAgICAgICAgIGlmIChDaGVja19EX1NzZmRjV1AoKSkKLy8gICAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZXw9V1A7Ci8vICAgICAgIH0KLy8gICAgfQoKICAgIHJldHVybihTVUNDRVNTKTsKfQoKLy8tLS0tLSBTZWFyY2hfRF9DSVMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTZWFyY2hfRF9DSVMoc3RydWN0IHVzX2RhdGEgKnVzKQp7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglNZWRpYS5ab25lPTA7IE1lZGlhLlNlY3Rvcj0wOwoKCWZvciAoTWVkaWEuUGh5QmxvY2s9MDsgTWVkaWEuUGh5QmxvY2s8KFNzZmRjLk1heEJsb2Nrcy1Tc2ZkYy5NYXhMb2dCbG9ja3MtMSk7IE1lZGlhLlBoeUJsb2NrKyspCgl7CgkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCXsKCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCXJldHVybihFUlJPUik7CgkJfQoKCQlpZiAoIUNoZWNrX0RfRmFpbEJsb2NrKFJlZHVuZGFudCkpCgkJCWJyZWFrOwoJfQoKCWlmIChNZWRpYS5QaHlCbG9jaz09KFNzZmRjLk1heEJsb2Nrcy1Tc2ZkYy5NYXhMb2dCbG9ja3MtMSkpCgl7CgkJU3NmZGNfRF9SZXNldCh1cyk7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCgl3aGlsZSAoTWVkaWEuU2VjdG9yPENJU19TRUFSQ0hfU0VDVCkKCXsKCQlpZiAoTWVkaWEuU2VjdG9yKQoJCXsKCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQl7CgkJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJCXJldHVybihFUlJPUik7CgkJCX0KCQl9CgkJaWYgKCFDaGVja19EX0RhdGFTdGF0dXMoUmVkdW5kYW50KSkKCQl7CgkJCWlmIChTc2ZkY19EX1JlYWRTZWN0KHVzLFdvcmtCdWYsUmVkdW5kYW50KSkKCQkJewoJCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCQlyZXR1cm4oRVJST1IpOwoJCQl9CgoJCQlpZiAoQ2hlY2tfRF9DSVNkYXRhKFdvcmtCdWYsUmVkdW5kYW50KSkKCQkJewoJCQkJU3NmZGNfRF9SZXNldCh1cyk7CgkJCQlyZXR1cm4oRVJST1IpOwoJCQl9CgoJCQlDaXNBcmVhLlBoeUJsb2NrPU1lZGlhLlBoeUJsb2NrOwoJCQlDaXNBcmVhLlNlY3Rvcj1NZWRpYS5TZWN0b3I7CgkJCVNzZmRjX0RfUmVzZXQodXMpOwoJCQlyZXR1cm4oU1VDQ0VTUyk7CgkJfQoKCQlNZWRpYS5TZWN0b3IrKzsKCX0KCglTc2ZkY19EX1Jlc2V0KHVzKTsKCXJldHVybihFUlJPUik7Cn0KCi8vLS0tLS0gTWFrZV9EX0xvZ1RhYmxlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgTWFrZV9EX0xvZ1RhYmxlKHN0cnVjdCB1c19kYXRhICp1cykKewoJV09SRCAgcGh5YmxvY2ssbG9nYmxvY2s7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglpZiAoTG9nMlBoeVtNZWRpYS5ab25lXT09TlVMTCkKCXsKCQlMb2cyUGh5W01lZGlhLlpvbmVdID0ga21hbGxvYyhNQVhfTE9HQkxPQ0sqc2l6ZW9mKFdPUkQpLCBHRlBfS0VSTkVMKTsKCQkvL3ByaW50aygiRXhBbGxvY2F0ZVBvb2wgWm9uZSA9ICV4LCBBZGRyID0gJXhcbiIsIE1lZGlhLlpvbmUsIExvZzJQaHlbTWVkaWEuWm9uZV0pOwoJCWlmIChMb2cyUGh5W01lZGlhLlpvbmVdPT1OVUxMKQoJCQlyZXR1cm4oRVJST1IpOwoJfQoKCU1lZGlhLlNlY3Rvcj0wOwoKCS8vZm9yKE1lZGlhLlpvbmU9MDsgTWVkaWEuWm9uZTxNQVhfWk9ORU5VTTsgTWVkaWEuWm9uZSsrKQoJLy9mb3IoTWVkaWEuWm9uZT0wOyBNZWRpYS5ab25lPFNzZmRjLk1heFpvbmVzOyBNZWRpYS5ab25lKyspCgl7CgkJLy9wcmludGsoIk1ha2VfRF9Mb2dUYWJsZSAtLS0gTWVkaWFab25lID0gMHgleFxuIiwgTWVkaWEuWm9uZSk7CgkJZm9yKE1lZGlhLkxvZ0Jsb2NrPTA7IE1lZGlhLkxvZ0Jsb2NrPFNzZmRjLk1heExvZ0Jsb2NrczsgTWVkaWEuTG9nQmxvY2srKykKCQkJTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109Tk9fQVNTSUdOOwoKCQlmb3IoTWVkaWEuUGh5QmxvY2s9MDsgTWVkaWEuUGh5QmxvY2s8KE1BWF9CTE9DS05VTS84KTsgTWVkaWEuUGh5QmxvY2srKykKCQkJQXNzaWduW01lZGlhLlpvbmVdW01lZGlhLlBoeUJsb2NrXT0weDAwOwoKCQlmb3IoTWVkaWEuUGh5QmxvY2s9MDsgTWVkaWEuUGh5QmxvY2s8U3NmZGMuTWF4QmxvY2tzOyBNZWRpYS5QaHlCbG9jaysrKQoJCXsKCQkJaWYgKCghTWVkaWEuWm9uZSkgJiYgKE1lZGlhLlBoeUJsb2NrPD1DaXNBcmVhLlBoeUJsb2NrKSkKCQkJewoJCQkJU2V0X0RfQml0KEFzc2lnbltNZWRpYS5ab25lXSxNZWRpYS5QaHlCbG9jayk7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKFNzZmRjX0RfUmVhZFJlZHREYXRhKHVzLCBSZWR1bmRhbnQpKQoJCQl7IFNzZmRjX0RfUmVzZXQodXMpOyByZXR1cm4oRVJST1IpOyB9CgoJCQlpZiAoIUNoZWNrX0RfRGF0YUJsYW5rKFJlZHVuZGFudCkpCgkJCQljb250aW51ZTsKCgkJCVNldF9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwoKCQkJaWYgKENoZWNrX0RfRmFpbEJsb2NrKFJlZHVuZGFudCkpCgkJCQljb250aW51ZTsKCgkJCS8vaWYgKENoZWNrX0RfRGF0YVN0YXR1cyhSZWR1bmRhbnQpKQoJCQkvLyAgICBjb250aW51ZTsKCgkJCWlmIChMb2FkX0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCkpCgkJCQljb250aW51ZTsKCgkJCWlmIChNZWRpYS5Mb2dCbG9jaz49U3NmZGMuTWF4TG9nQmxvY2tzKQoJCQkJY29udGludWU7CgoJCQlpZiAoTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109PU5PX0FTU0lHTikKCQkJewoJCQkJTG9nMlBoeVtNZWRpYS5ab25lXVtNZWRpYS5Mb2dCbG9ja109TWVkaWEuUGh5QmxvY2s7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJcGh5YmxvY2sgICAgID0gTWVkaWEuUGh5QmxvY2s7CgkJCWxvZ2Jsb2NrICAgICA9IE1lZGlhLkxvZ0Jsb2NrOwoJCQlNZWRpYS5TZWN0b3IgPSAoQllURSkoU3NmZGMuTWF4U2VjdG9ycy0xKTsKCgkJCWlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YSh1cywgUmVkdW5kYW50KSkKCQkJeyBTc2ZkY19EX1Jlc2V0KHVzKTsgcmV0dXJuKEVSUk9SKTsgfQoKCQkJaWYgKCFMb2FkX0RfTG9nQmxvY2tBZGRyKFJlZHVuZGFudCkpCgkJCXsKCQkJCWlmIChNZWRpYS5Mb2dCbG9jaz09bG9nYmxvY2spCgkJCQl7CgkJCQkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja107CgoJCQkJCWlmIChTc2ZkY19EX1JlYWRSZWR0RGF0YSh1cywgUmVkdW5kYW50KSkKCQkJCQl7IFNzZmRjX0RfUmVzZXQodXMpOyByZXR1cm4oRVJST1IpOyB9CgoJCQkJCU1lZGlhLlBoeUJsb2NrPXBoeWJsb2NrOwoKCQkJCQlpZiAoIUxvYWRfRF9Mb2dCbG9ja0FkZHIoUmVkdW5kYW50KSkKCQkJCQl7CgkJCQkJCWlmIChNZWRpYS5Mb2dCbG9jayE9bG9nYmxvY2spCgkJCQkJCXsKCQkJCQkJCU1lZGlhLlBoeUJsb2NrPUxvZzJQaHlbTWVkaWEuWm9uZV1bbG9nYmxvY2tdOwoJCQkJCQkJTG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja109cGh5YmxvY2s7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJTWVkaWEuUGh5QmxvY2s9TG9nMlBoeVtNZWRpYS5ab25lXVtsb2dibG9ja107CgkJCQkJCUxvZzJQaHlbTWVkaWEuWm9uZV1bbG9nYmxvY2tdPXBoeWJsb2NrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJTWVkaWEuU2VjdG9yPTA7CgovLyBoZXJlIE5vdCB5ZXQKLy8jaWZkZWYgTDJQX0VSUl9FUkFTRQovLwkJCWlmICghKFNzZmRjLkF0dHJpYnV0ZSAmTVdQKSkKLy8JCQl7Ci8vCQkJCVNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8JCQkJaWYgKFNzZmRjX0RfRXJhc2VCbG9jayhmZG9FeHQpKQovLwkJCQkJcmV0dXJuKEVSUk9SKTsKLy8KLy8JCQkJaWYgKFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSkKLy8JCQkJewovLwkJCQkJaWYgKE1hcmtGYWlsX0RfUGh5T25lQmxvY2soKSkKLy8JCQkJCQlyZXR1cm4oRVJST1IpOwovLwkJCQl9Ci8vCQkJCWVsc2UKLy8JCQkJCUNscl9EX0JpdChBc3NpZ25bTWVkaWEuWm9uZV0sTWVkaWEuUGh5QmxvY2spOwovLwkJCX0KLy8jZWxzZQovLwkJCVNzZmRjLkF0dHJpYnV0ZXw9TVdQOwovLyNlbmRpZgoJCQlNZWRpYS5QaHlCbG9jaz1waHlibG9jazsKCgkJfSAvLyBFbmQgZm9yIChNZWRpYS5QaHlCbG9jazxTc2ZkYy5NYXhCbG9ja3MpCgoJCUFzc2lnblN0YXJ0W01lZGlhLlpvbmVdPTA7CgoJfSAvLyBFbmQgZm9yIChNZWRpYS5ab25lPE1BWF9aT05FTlVNKQoKCVNzZmRjX0RfUmVzZXQodXMpOwoJcmV0dXJuKFNVQ0NFU1MpOwp9CgovLy0tLS0tIE1hcmtGYWlsX0RfUGh5T25lQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IE1hcmtGYWlsX0RfUGh5T25lQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQp7CglCWVRFIHNlY3Q7CgkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwoJLy9BRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKCglzZWN0PU1lZGlhLlNlY3RvcjsKCVNldF9EX0ZhaWxCbG9jayhXb3JrUmVkdW5kKTsKCS8vU3NmZGNfRF9Xcml0ZVJlZHRNb2RlKCk7CgoJZm9yKE1lZGlhLlNlY3Rvcj0wOyBNZWRpYS5TZWN0b3I8U3NmZGMuTWF4U2VjdG9yczsgTWVkaWEuU2VjdG9yKyspCgl7CgkJaWYgKFNzZmRjX0RfV3JpdGVSZWR0RGF0YSh1cywgV29ya1JlZHVuZCkpCgkJewoJCQlTc2ZkY19EX1Jlc2V0KHVzKTsKCQkJTWVkaWEuU2VjdG9yICAgPSBzZWN0OwoJCQlFcnJDb2RlICAgICAgICA9IEVSUl9Id0Vycm9yOwoJCQlNZWRpYUNoYW5nZSA9IEVSUk9SOwoJCQlyZXR1cm4oRVJST1IpOwoJCX0gLy8gTk8gU3RhdHVzIENoZWNrCgl9CgoJU3NmZGNfRF9SZXNldCh1cyk7CglNZWRpYS5TZWN0b3I9c2VjdDsKCXJldHVybihTVUNDRVNTKTsKfQovKgovLwovLy8vLS0tLS0gU01fSW5pdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNNX0luaXQodm9pZCkKLy97Ci8vICAgIF9Id19EX0NsckludENhcmRDaGcoKTsKLy8gICAgX0h3X0RfU2V0SW50TWFzaygpOwovLyAgICAvLyBGb3IgRE1BIEludGVycnVwdAovLyAgICBfSHdfRF9DbHJETUFJbnRDYXJkQ2hnKCk7Ci8vICAgIF9Id19EX1NldERNQUludE1hc2soKTsKLy99Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0VyYXNlQWxsUmVkdERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBNZWRpYV9EX0VyYXNlQWxsUmVkdERhdGEoRFdPUkQgSW5kZXgsIEJPT0xFQU4gQ2hlY2tCbG9jaykKLy97Ci8vICAgIEJZVEUgICAgaTsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFQb3dlcigpKQovLyAgICAgICAgcmV0dXJuKEVyckNvZGUpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVdQKCkpCi8vICAgICAgICByZXR1cm4oRXJyQ29kZSk7Ci8vCi8vICAgIGZvciAoaT0wOyBpPFJFRFRTSVpFOyBpKyspCi8vICAgICAgICBXb3JrUmVkdW5kW2ldID0gMHhGRjsKLy8KLy8gICAgTWVkaWEuWm9uZSA9IChCWVRFKUluZGV4OwovLyAgICBmb3IgKE1lZGlhLlBoeUJsb2NrPTA7IE1lZGlhLlBoeUJsb2NrPFNzZmRjLk1heEJsb2NrczsgTWVkaWEuUGh5QmxvY2srKykKLy8gICAgewovLyAgICAgICAgaWYgKCghTWVkaWEuWm9uZSkgJiYgKE1lZGlhLlBoeUJsb2NrPD1DaXNBcmVhLlBoeUJsb2NrKSkKLy8gICAgICAgICAgICBjb250aW51ZTsKLy8KLy8gICAgICAgIGlmIChTc2ZkY19EX0VyYXNlQmxvY2soZmRvRXh0KSkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBFcnJDb2RlID0gRVJSX0h3RXJyb3I7Ci8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIH0KLy8KLy8gICAgICAgIGZvcihNZWRpYS5TZWN0b3I9MDsgTWVkaWEuU2VjdG9yPFNzZmRjLk1heFNlY3RvcnM7IE1lZGlhLlNlY3RvcisrKQovLyAgICAgICAgewovLyAgICAgICAgICAgIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSgpOwovLwovLyAgICAgICAgICAgIGlmIChTc2ZkY19EX1dyaXRlUmVkdERhdGEoV29ya1JlZHVuZCkpCi8vICAgICAgICAgICAgewovLyAgICAgICAgICAgICAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vICAgICAgICAgICAgICAgIEVyckNvZGUgICAgICAgID0gRVJSX0h3RXJyb3I7Ci8vICAgICAgICAgICAgICAgIE1lZGlhQ2hhbmdlICAgID0gRVJST1I7Ci8vICAgICAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgICAgICAgICAgfSAvLyBOTyBTdGF0dXMgQ2hlY2sKLy8gICAgICAgIH0KLy8KLy8gICAgICAgIFNzZmRjX0RfUmVzZXQoZmRvRXh0KTsKLy8gICAgfQovLwovLyAgICBTc2ZkY19EX1Jlc2V0KGZkb0V4dCk7Ci8vCi8vICAgIHJldHVybihTVUNDRVNTKTsKLy99Ci8vCi8vLy8tLS0tLSBNZWRpYV9EX0dldE1lZGlhSW5mbygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL0RXT1JEIE1lZGlhX0RfR2V0TWVkaWFJbmZvKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIFBJT0NUTF9NRURJQV9JTkZPX0lOIHBQYXJhbUluLCBQSU9DVExfTUVESUFfSU5GT19PVVQgcFBhcmFtT3V0KQovL3sKLy8gICAgcFBhcmFtT3V0LT5FcnJDb2RlID0gU1RBVFVTX0NNRF9GQUlMOwovLwovLyAgICBJbml0X0RfU21hcnRNZWRpYSgpOwovLwovLyAgICBpZiAoQ2hlY2tfRF9NZWRpYVBvd2VyKCkpCi8vICAgICAgICByZXR1cm4gKEVyckNvZGU9PUVSUl9Ob1NtYXJ0TWVkaWEpID8gU1RBVFVTX0NNRF9OT19NRURJQSA6IFNUQVRVU19DTURfRkFJTDsKLy8KLy8gICAgaWYgKFNldF9EX1BoeUZtdFZhbHVlKGZkb0V4dCkpCi8vICAgICAgICByZXR1cm4gU1RBVFVTX0NNRF9GQUlMOwovLwovLyAgICAvL3VzbGVlcCg1NioxMDI0KTsKLy8gICAgaWYgKFNlYXJjaF9EX0NJUyhmZG9FeHQpKQovLyAgICAgICAgcmV0dXJuIFNUQVRVU19DTURfRkFJTDsKLy8KLy8gICAgaWYgKENoZWNrX0RfTWVkaWFXUCgpKQovLyAgICAgICAgcmV0dXJuIFNUQVRVU19DTURfTUVESUFfV1A7Ci8vCi8vICAgIHBQYXJhbU91dC0+UGFnZVNpemUgID0gU3NmZGMuTWF4U2VjdG9yczsKLy8gICAgcFBhcmFtT3V0LT5CbG9ja1NpemUgPSBTc2ZkYy5NYXhCbG9ja3M7Ci8vICAgIHBQYXJhbU91dC0+Wm9uZVNpemUgID0gU3NmZGMuTWF4Wm9uZXM7Ci8vCi8vICAgIHJldHVybiBTVEFUVVNfQ01EX1NVQ0NFU1M7Ci8vfSovCg==